Setiap piksel gambar bmp membawa maklumat mengenai warnanya dari model RGB (model warna gambar, yang terdiri daripada tiga komponen R - merah, G - hijau, B - biru). Lebih senang menyimpan nilai warna RGB dalam format hex (heksadesimal), di mana nilai setiap komponen berada dalam lingkungan 00… FF. Gabungan 000000 sepadan dengan hitam, FFFFFF - ke putih.
Untuk memulakan, mari buka ruang Lukisan nama:
menggunakan System. Drawing;
Mari buat contoh baru kelas Bitmap:
Bitmap bmp = Bitmap baru ("c: / 1.bmp") / / c: / 1.bmp - alamat gambar
Untuk menyimpan nilai warna piksel, anda boleh membuat struktur terpisah, yang bidangnya adalah komponen RGB, tetapi saya memutuskan untuk menggunakan kelas Warna dari ruang nama Lukisan. Untuk mendapatkan warna, kami menggunakan kaedah GetPixel (x, y), di mana x, y adalah koordinat piksel gambar. Sekiranya anda ingin menggunakan struktur anda sendiri untuk menyimpan warnanya, bukan contoh kelas Warna, maka anda boleh menggunakan kaedah bmp. GetPixel (x, y).x untuk mendapatkan komponen RGB tunggal, di mana x adalah R, G, atau B.
Warna [,] warna = Warna baru [bmp. Width, bmp. Highight];
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 fail, kami menggunakan kelas StreamWriter. Oleh kerana elemen R, G, B dari contoh Warna adalah jenis byte, kami mengubahnya menggunakan kaedah ToString ("X2") ke jenis rentetan yang akan menyimpan nilai heksa 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. Close ();
Sekarang mari kita lakukan operasi terbalik - ubah fail teks yang dihasilkan menjadi gambar.
Dengan bantuan StreamReader kami membaca maklumat dari fail.
StreamReader txtFile = StreamReader baru ("c: / 1.txt");
Kami mengira lebar dan tinggi gambar. Oleh kerana setiap piksel mengambil 6 aksara dan 1 jurang, dan tidak ada jurang pada akhir, kami menggunakan formula berikut untuk mengira lebarnya:
temp = txtFile. ReadLine ();
lebar = (temp. Panjang + 1) / 7;
Ketinggian gambar adalah bilangan baris dalam fail:
semasa (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
tinggi ++;
}
tinggi ++;
Pindahkan penunjuk baca dalam fail ke awal:
txtFile. DiscardBufferedData ();
Buat contoh baru kelas Bitmap:
Bitmap bmp2 = Bitmap baru (lebar, tinggi);
Dengan menggunakan kaedah split, kita membahagikan elemen matriks. Kami menyatakan tiga pemboleh ubah jenis bait - R, G, B. Dengan menggunakan kaedah Parse dan Substring, pilih elemen warna secara berasingan.
Untuk mengisi piksel dalam gambar dengan warna ini, gunakan kaedah SetPixel (j, i, Color. FromArgb (R, G, B)), dengan j, i adalah koordinat gambar, Color. FromArgb (R, G, B) adalah kaedah yang membuat struktur Warna.
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. Globalization. NumberStyles. HexNumber)
G = byte. Parse (substring [j]. Substring (2, 2), System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (substring [j]. Substring (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Sekarang anda boleh menyimpan gambar. Sekiranya anda bekerja di WindowsForm, anda boleh menggunakan kelas SaveFileDialog:
SaveFileDialog saveImage = SaveFileDialog baru ();
saveImage. Filter = fail bmp (*. bmp) | *. bmp | Semua fail (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);