Svaki piksel BMP slike nosi informacije o svojoj boji iz RGB modela (model boje slike koji se sastoji od tri komponente R - crvena, G - zelena, B - plava). Pogodnije je pohraniti vrijednost RGB boje u heksadecimalnom formatu (heksadecimalnom), gdje je vrijednost svake komponente u rasponu 00 … FF. Kombinacija 000000 odgovara crnoj boji, FFFFFF - bijeloj.
Za početak otvorimo prostor imena Crtanje:
pomoću System. Drawing;
Stvorimo novu instancu klase Bitmap:
Bitmapa bmp = nova bitmapa ("c: / 1.bmp") / / c: / 1.bmp - adresa slike
Da biste pohranili vrijednost boje piksela, možete stvoriti zasebnu strukturu, čija su polja RGB komponente, ali odlučio sam da koristim klasu Color iz prostora imena Crtanje. Da bismo dobili boju, koristimo metodu GetPixel (x, y), gdje su x, y koordinate piksela slike. Ako želite koristiti vlastitu strukturu za pohranu boje, a ne primjerak klase Color, tada možete koristiti metodu bmp. GetPixel (x, y).x da biste dobili jednu RGB komponentu, gdje je x R, G ili B.
Boja [,] boja = nova Boja [bmp. Width, bmp. Height];
za (int y = 0; y <bmp. Height; y ++)
za (int x = 0; x <bmp. Width; x ++)
{
boja [x, y] = bmp. GetPixel (x, y);
}
Da bismo zapisali vrijednosti boja u datoteku, koristimo klasu StreamWriter. Budući da su R, G, B elementi instance Color tipa bajta, pretvaramo ih pomoću metode ToString ("X2") u tip niza koji će pohraniti hex vrijednosti RGB elemenata.
StreamWriter steamWriter = novi StreamWriter ("c: / 1.txt");
za (int y = 0; y <bmp. Height; y ++)
{
za (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (boja [x, y]. R. ToString ("X2"));
steamWriter. Write (boja [x, y]. G. ToString ("X2"));
steamWriter. Write (boja [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Izvršimo sada obrnutu operaciju - pretvorimo rezultirajuću tekstualnu datoteku u sliku.
Uz pomoć StreamReader-a čitamo informacije iz datoteke.
StreamReader txtFile = novi StreamReader ("c: / 1.txt");
Izračunavamo širinu i visinu slike. Budući da svaki piksel uzima 6 znakova i 1 razmak, a na kraju nema praznine, za izračunavanje širine koristimo sljedeću formulu:
temp = txtFile. ReadLine ();
width = (temp. Length + 1) / 7;
Visina slike je broj linija u datoteci:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
visina ++;
}
visina ++;
Pomaknite pokazivač čitanja u datoteci na početak:
txtFile. DiscardBufferedData ();
Kreirajte novu instancu klase Bitmap:
Bitmapa bmp2 = nova bitmapa (širina, visina);
Metodom split razdvajamo elemente matrice. Deklariramo tri varijable bajt tipa - R, G, B. Koristeći metode Parse i Substring, zasebno odaberite elemente boje.
Za popunjavanje piksela na slici ovom bojom koristite metodu SetPixel (j, i, Color. FromArgb (R, G, B)), gdje su j, i koordinate slike, Color. FromArgb (R, G, B) je metoda koja stvara strukturu Color.
za (int i = 0; i <visina; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
za (int j = 0; j <širina; j + +)
{
R = bajt. Parse (podniz [j]. Podniz (0, 2), System. Globalization. NumberStyles. HexNumber)
G = bajt. Parse (podniz [j]. Podniz (2, 2), System. Globalization. NumberStyles. HexNumber)
B = bajt. Parse (podniz [j]. Podniz (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Sada možete sačuvati slike. Ako radite u WindowsFormu, možete koristiti klasu SaveFileDialog:
SaveFileDialog saveImage = novo SaveFileDialog ();
saveImage. Filter = bmp datoteke (*. bmp) | *. bmp | Sve datoteke (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);