Cada píxel d'una imatge BMP conté informació sobre el seu color del model RGB (el model de color de la imatge, que consta de tres components R - vermell, G - verd, B - blau). És més convenient emmagatzemar el valor de color RGB en format hexadecimal (hexadecimal), on el valor de cada component està en l'interval 00 … FF. La combinació 000000 correspon a negre, FFFFFF - a blanc.
Per començar, obrim l’espai de noms Drawing:
utilitzant System. Drawing;
Creem una nova instància de la classe Bitmap:
Bitmap bmp = new Bitmap ("c: / 1.bmp") / / c: / 1.bmp - adreça de la imatge
Per emmagatzemar el valor del color dels píxels, podeu crear una estructura independent, els camps de la qual siguin components RGB, però he decidit utilitzar la classe Color des de l’espai de noms Dibuix. Per obtenir el color, fem servir el mètode GetPixel (x, y), on x, y són les coordenades del píxel de la imatge. Si voleu utilitzar la vostra pròpia estructura per emmagatzemar el color, en lloc d'una instància de la classe Color, podeu utilitzar el mètode bmp. GetPixel (x, y).x per obtenir un component RGB únic, on x és R, G o B.
Color [,] color = new Color [bmp. Width, bmp. Height];
per a (int y = 0; y <bmp. Hight; y ++)
per a (int x = 0; x <bmp. Width; x ++)
{
color [x, y] = bmp. GetPixel (x, y);
}
Per escriure valors de color a un fitxer, fem servir la classe StreamWriter. Com que els elements R, G, B de la instància Color són del tipus de byte, els convertim mitjançant el mètode ToString ("X2") a un tipus de cadena que emmagatzemarà els valors hexadecimals dels elements RGB.
StreamWriter steamWriter = nou StreamWriter ("c: / 1.txt");
per a (int y = 0; y <bmp. Hight; y ++)
{
per a (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 ();
Ara realitzem l'operació inversa: converteix el fitxer de text resultant en una imatge.
Amb l'ajut de StreamReader llegim informació del fitxer.
StreamReader txtFile = nou StreamReader ("c: / 1.txt");
Calculem l'amplada i l'alçada de la imatge. Com que cada píxel té 6 caràcters i 1 espai i no hi ha cap espai al final, fem servir la fórmula següent per calcular l’amplada:
temp = txtFile. ReadLine ();
amplada = (longitud temporal + 1) / 7;
L’altura de la imatge és el nombre de línies del fitxer:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
alçada ++;
}
alçada ++;
Moveu el punter de lectura al fitxer fins al principi:
txtFile. DiscardBufferedData ();
Creeu una nova instància de la classe Bitmap:
Mapa de bits bmp2 = mapa de bits nou (amplada, alçada);
Mitjançant el mètode split, dividim els elements de la matriu. Declarem tres variables del tipus d'octet: R, G, B. Mitjançant els mètodes Parse i Substring, seleccioneu els elements de color per separat.
Per omplir el píxel de la imatge amb aquest color, utilitzeu el mètode SetPixel (j, i, Color. FromArgb (R, G, B)), on j, i són les coordenades de la imatge, Color. FromArgb (R, G, B) és el mètode que crea l'estructura Color.
for (int i = 0; i <altura; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
per a (int j = 0; j <ample; j + +)
{
R = byte. Parse (subcadena [j]. Subcadena (0, 2), System. Globalization. NumberStyles. HexNumber)
G = byte. Parse (subcadena [j]. Subcadena (2, 2),
System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (subcadena [j]. Subcadena (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Ara podeu desar les imatges. Si esteu treballant a WindowsForm, podeu utilitzar la classe SaveFileDialog:
SaveFileDialog saveImage = new SaveFileDialog ();
saveImage. Filter = fitxers bmp (*. bmp) | *. bmp | Tots els fitxers (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);