Katrs bmp attēla pikselis nes informāciju par tā krāsu no RGB modeļa (attēla krāsu modelis, kas sastāv no trim komponentiem R - sarkans, G - zaļš, B - zils). Ērtāk ir uzglabāt RGB krāsu vērtību sešpadsmit formātā (heksadecimālā), kur katra komponenta vērtība ir diapazonā no 00… FF. Kombinācija 000000 atbilst melnai, FFFFFF - baltai.
Lai sāktu darbu, atveriet zīmējumu Zīmēšanas vieta:
izmantojot System. Drawing;
Izveidosim jaunu klases Bitmap instanci:
Bitmap bmp = new Bitmap ("c: / 1.bmp") / / c: / 1.bmp - attēla adrese
Lai saglabātu pikseļu krāsas vērtību, varat izveidot atsevišķu struktūru, kuras lauki ir RGB komponenti, bet es nolēmu izmantot krāsu klasi no nosaukumvietas Zīmējums. Lai iegūtu krāsu, mēs izmantojam GetPixel (x, y) metodi, kur x, y ir attēla pikseļa koordinātas. Ja krāsas saglabāšanai vēlaties izmantot savu struktūru, nevis krāsas krāsu eksemplāru, varat izmantot metodi bmp. GetPixel (x, y).x, lai iegūtu vienu RGB komponentu, kur x ir R, G vai B.
Krāsa [,] krāsa = jauna Krāsa [bmp. Width, bmp. Height];
par (int y = 0; y <bmp. Augstums; y ++)
par (int x = 0; x <bmp. Platums; x ++)
{
krāsa [x, y] = bmp. GetPixel (x, y);
}
Lai failā ierakstītu krāsu vērtības, mēs izmantojam StreamWriter klasi. Tā kā Krāsu instances R, G, B elementi ir baitu tipa, mēs tos, izmantojot ToString ("X2") metodi, pārveidojam par virkņu tipu, kurā tiks saglabātas RGB elementu sešstūra vērtības.
StreamWriter steamWriter = jauns StreamWriter ("c: / 1.txt");
par (int y = 0; y <bmp. Augstums; y ++)
{
par (int x = 0; x <bmp. Platums; x ++)
{
steamWriter. Write (krāsa [x, y]. R. ToString ("X2"));
steamWriter. Write (krāsa [x, y]. G. ToString ("X2"));
steamWriter. Write (krāsa [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Tagad veiksim reverso darbību - pārveidojiet iegūto teksta failu attēlā.
Ar StreamReader palīdzību mēs lasām informāciju no faila.
StreamReader txtFile = jauns StreamReader ("c: / 1.txt");
Mēs aprēķinām attēla platumu un augstumu. Tā kā katram pikseļam ir 6 rakstzīmes un 1 atstarpe, un beigās nav atstarpes, platuma aprēķināšanai mēs izmantojam šādu formulu:
temp = txtFile. ReadLine ();
platums = (temp. Length + 1) / 7;
Attēla augstums ir faila rindu skaits:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
augstums ++;
}
augstums ++;
Pārvietojiet faila lasīšanas rādītāju uz sākumu:
txtFile. DiscardBufferedData ();
Izveidojiet jaunu Bitmap klases instanci:
Bitmap bmp2 = jauns Bitmap (platums, augstums);
Izmantojot sadalīšanas metodi, mēs sadalām matricas elementus. Mēs deklarējam trīs baitu tipa mainīgos - R, G, B. Izmantojot Parse un Substring metodes, krāsu elementus atlasiet atsevišķi.
Lai aizpildītu attēla pikseļu ar šo krāsu, izmantojiet metodi SetPixel (j, i, Color. FromArgb (R, G, B)), kur j, i ir attēla koordinātas, Color. FromArgb (R, G, B) ir metode, kas izveido struktūru Color.
par (int i = 0; i <augstums; i + +)
{
temp = txtFile2. ReadLine ();
virkne apakšvirkne = temp. Split ('');
par (int j = 0; j <platums; j + +)
{
R = baits. Parse (apakšvirkne [j]. Apakšvirsma (0, 2), System. Globalization. NumberStyles. HexNumber)
G = baits. Parse (apakšvirkne [j]. Apakšvirsma (2, 2), System. Globalization. NumberStyles. HexNumber)
B = baits. Parse (apakšvirkne [j]. Apakšvirsma (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Tagad jūs varat saglabāt attēlus. Ja strādājat sistēmā WindowsForm, varat izmantot klasi SaveFileDialog:
SaveFileDialog saveImage = jauns SaveFileDialog ();
saveImage. Filter = bmp faili (*. bmp) | *. bmp | visi faili (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);