Setiap piksel gambar bmp membawa informasi tentang warnanya dari model RGB (model warna gambar, yang terdiri dari tiga komponen R - merah, G - hijau, B - biru). Lebih mudah untuk menyimpan nilai warna RGB dalam format hex (heksadesimal), di mana nilai setiap komponen berada dalam kisaran 00… FF. Kombinasi 000000 sesuai dengan hitam, FFFFFF - putih.
Untuk memulai, mari buka ruang nama Gambar:
menggunakan System. Drawing;
Mari kita buat instance baru dari kelas Bitmap:
Bitmap bmp = Bitmap baru ("c: / 1.bmp") // c: / 1.bmp - alamat gambar
Untuk menyimpan nilai warna piksel, Anda dapat membuat struktur terpisah, yang bidangnya adalah komponen RGB, tetapi saya memutuskan untuk menggunakan kelas Warna dari ruang nama Gambar. Untuk mendapatkan warna, kami menggunakan metode GetPixel (x, y), di mana x, y adalah koordinat piksel gambar. Jika Anda ingin menggunakan struktur Anda sendiri untuk menyimpan warna, daripada turunan dari kelas Warna, maka Anda dapat menggunakan metode bmp. GetPixel (x, y).x untuk mendapatkan komponen RGB tunggal, di mana x adalah R, G, atau B
Warna [,] color = new Color [bmp. Width, bmp. Height];
untuk (int y = 0; y <bmp. Tinggi; y ++)
untuk (int x = 0; x <bmp. Lebar; x ++)
{
warna [x, y] = bmp. GetPixel (x, y);
}
Untuk menulis nilai warna ke file, kami menggunakan kelas StreamWriter. Karena elemen R, G, B dari instance Color bertipe byte, kami mengonversinya menggunakan metode ToString ("X2") menjadi tipe string yang akan menyimpan nilai hex dari elemen RGB.
StreamWriter steamWriter = StreamWriter baru ("c: / 1.txt");
untuk (int y = 0; y <bmp. Tinggi; y ++)
{
untuk (int x = 0; x <bmp. Lebar; x ++)
{
steamWriter. Write (warna [x, y]. R. ToString ("X2"));
steamWriter. Write (warna [x, y]. G. ToString ("X2"));
steamWriter. Write (warna [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine();
}
steamWriter. Tutup();
Sekarang mari kita lakukan operasi sebaliknya - ubah file teks yang dihasilkan menjadi gambar.
Dengan bantuan StreamReader kami membaca informasi dari file.
StreamReader txtFile = StreamReader baru ("c: / 1.txt");
Kami menghitung lebar dan tinggi gambar. Karena setiap piksel membutuhkan 6 karakter dan 1 celah, dan tidak ada celah di akhir, kami menggunakan rumus berikut untuk menghitung lebar:
temp = txtFile. ReadLine();
lebar = (temp. Panjang + 1) / 7;
Tinggi gambar adalah jumlah baris dalam file:
sementara (!txtFile. EndOfStream)
{
txtFile. ReadLine();
tinggi ++;
}
tinggi ++;
Pindahkan penunjuk baca dalam file ke awal:
txtFile. DiscardBufferedData();
Buat instance baru dari kelas Bitmap:
Bitmap bmp2 = Bitmap baru (lebar, tinggi);
Menggunakan metode split, kami membagi elemen matriks. Kami mendeklarasikan tiga variabel tipe byte - R, G, B. Menggunakan metode Parse dan Substring, pilih elemen warna secara terpisah.
Untuk mengisi piksel pada gambar dengan warna ini, gunakan metode SetPixel (j, i, Color. FromArgb (R, G, B)), di mana j, i adalah koordinat gambar, Color. FromArgb (R, G, B) adalah metode yang membuat struktur Color.
untuk (int i = 0; i <tinggi; i ++)
{
temp = txtFile2. ReadLine();
string substring = temp. Split ('');
untuk (int j = 0; j <lebar; j ++)
{
R = byte. Parse (substring [j]. Substring (0, 2), System. Globalisasi. NumberStyles. HexNumber)
G = byte. Parse (substring [j]. Substring (2, 2), System. Globalisasi. NumberStyles. HexNumber)
B = byte. Parse (substring [j]. Substring (4, 2), System. Globalisasi. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Sekarang Anda dapat menyimpan gambar. Jika Anda bekerja di WindowsForm, Anda dapat menggunakan kelas SaveFileDialog:
SaveFileDialog saveImage = SaveFileDialog baru ();
saveImage. Filter = file bmp (*.bmp) | *.bmp | Semua file (*. *)
| *. * ;
saveImage. ShowDialog();
bmp2. Save (saveImage. FileName);