Fiecare pixel al unei imagini bmp transportă informații despre culoarea sa din modelul RGB (modelul color al imaginii, care este format din trei componente R - roșu, G - verde, B - albastru). Este mai convenabil să stocați valoarea culorii RGB în format hex (hexazecimal), unde valoarea fiecărei componente este în intervalul 00 … FF. Combinația 000000 corespunde negru, FFFFFF - alb.
Pentru a începe, să deschidem spațiul de nume Desen:
folosind System. Drawing;
Să creăm o nouă instanță a clasei Bitmap:
Bitmap bmp = Bitmap nou ("c: / 1.bmp") / / c: / 1.bmp - adresa imaginii
Pentru a stoca valoarea culorii pixelilor, puteți crea o structură separată, ale cărei câmpuri sunt componente RGB, dar am decis să folosesc clasa Color din spațiul de nume Drawing. Pentru a obține culoarea, folosim metoda GetPixel (x, y), unde x, y sunt coordonatele pixelului imaginii. Dacă doriți să utilizați propria structură pentru a stoca culoarea, mai degrabă decât o instanță din clasa Color, atunci puteți utiliza metoda bmp. GetPixel (x, y).x pentru a obține o singură componentă RGB, unde x este R, G sau B.
Color [,] color = new Color [bmp. Width, bmp. Height];
for (int y = 0; y <bmp. Hight; y ++)
for (int x = 0; x <bmp. Width; x ++)
{
culoare [x, y] = bmp. GetPixel (x, y);
}
Pentru a scrie valori de culoare într-un fișier, folosim clasa StreamWriter. Deoarece elementele R, G, B ale instanței Color sunt de tip octet, le convertim folosind metoda ToString ("X2") într-un tip șir care va stoca valorile hexagonale ale elementelor RGB.
StreamWriter steamWriter = nou StreamWriter ("c: / 1.txt");
for (int y = 0; y <bmp. Hight; y ++)
{
for (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (color [x, y]. R. ToString ("X2"));
steamWriter. Write (color [x, y]. G. ToString ("X2"));
steamWriter. Write (color [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Acum să efectuăm operația inversă - convertiți fișierul text rezultat într-o imagine.
Cu ajutorul StreamReader citim informații din fișier.
StreamReader txtFile = nou StreamReader ("c: / 1.txt");
Calculăm lățimea și înălțimea imaginii. Deoarece fiecare pixel are 6 caractere și 1 spațiu și nu există niciun spațiu la final, folosim următoarea formulă pentru a calcula lățimea:
temp = txtFile. ReadLine ();
lățime = (lungime temp. + 1) / 7;
Înălțimea imaginii este numărul de linii din fișier:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
înălțime ++;
}
înălțime ++;
Mutați indicatorul citit în fișier la început:
txtFile. DiscardBufferedData ();
Creați o nouă instanță a clasei Bitmap:
Bitmap bmp2 = nou Bitmap (lățime, înălțime);
Folosind metoda split, împărțim elementele matricei. Declarăm trei variabile de tip octet - R, G, B. Folosind metodele Parse și Substring, selectați separat elementele de culoare.
Pentru a umple pixelul din imagine cu această culoare, utilizați metoda SetPixel (j, i, Color. FromArgb (R, G, B)), unde j, i sunt coordonatele imaginii, Color. FromArgb (R, G, B) este metoda care creează structura Culoare.
for (int i = 0; i <înălțime; i + +)
{
temp = txtFile2. ReadLine ();
șir substring = temp. Split ('');
pentru (int j = 0; j <lățime; j + +)
{
R = octet. Parse (șir [j]. Șir (0, 2), System. Globalization. NumberStyles. HexNumber)
G = octet. Parse (șir [j]. Șir (2, 2), System. Globalization. NumberStyles. HexNumber)
B = octet. Parse (șir [j]. Șir (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Acum puteți salva imaginile. Dacă lucrați în WindowsForm, puteți utiliza clasa SaveFileDialog:
SaveFileDialog saveImage = new SaveFileDialog ();
saveImage. Filter = fișiere bmp (*. bmp) | *. bmp | Toate fișierele (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);