Každý pixel obrázka bmp nesie informácie o svojej farbe z modelu RGB (farebný model obrázka, ktorý sa skladá z troch zložiek R - červená, G - zelená, B - modrá). Je pohodlnejšie ukladať hodnotu farieb RGB v hexadecimálnom formáte (hexadecimálne), kde je hodnota každej zložky v rozmedzí 00 … FF. Kombinácia 000000 zodpovedá čiernej farbe, FFFFFF - bielej farbe.
Ak chcete začať, otvorme si menný priestor Kreslenie:
pomocou System. Drawing;
Vytvorme novú inštanciu triedy Bitmap:
Bitová mapa bmp = nová bitová mapa ("c: / 1.bmp") / / c: / 1.bmp - adresa obrázka
Ak chcete uložiť hodnotu farby pixelov, môžete vytvoriť samostatnú štruktúru, ktorej polia sú komponenty RGB, ale rozhodol som sa použiť triedu Color z menného priestoru Draw. Na získanie farby používame metódu GetPixel (x, y), kde x, y sú súradnice obrazového pixelu. Ak chcete na uloženie farby použiť svoju vlastnú štruktúru, a nie inštanciu triedy Color, môžete použiť metódu bmp. GetPixel (x, y).x na získanie jediného komponentu RGB, kde x je R, G alebo B.
Farba [,] farba = nová Farba [bmp. Šírka, bmp. Výška];
pre (int y = 0; y <bmp. výška; y ++)
pre (int x = 0; x <bmp. šírka; x ++)
{
farba [x, y] = bmp. GetPixel (x, y);
}
Na zápis hodnôt farieb do súboru používame triedu StreamWriter. Pretože prvky R, G, B inštancie Color sú bajtového typu, prevádzame ich pomocou metódy ToString („X2“) na typ reťazca, ktorý uloží hexadecimálne hodnoty prvkov RGB.
StreamWriter steamWriter = nový StreamWriter ("c: / 1.txt");
pre (int y = 0; y <bmp. výška; y ++)
{
pre (int x = 0; x <bmp. šírka; x ++)
{
steamWriter. Write (farba [x, y]. R. ToString ("X2"));
steamWriter. Write (farba [x, y]. G. ToString ("X2"));
steamWriter. Write (farba [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Teraz urobme reverznú operáciu - výsledný textový súbor preveďte na obrázok.
Pomocou aplikácie StreamReader načítame informácie zo súboru.
StreamReader txtFile = nový StreamReader ("c: / 1.txt");
Vypočítame šírku a výšku obrázka. Pretože každý pixel má 6 znakov a 1 medzeru a na konci nie je medzera, na výpočet šírky použijeme nasledujúci vzorec:
temp = txtFile. ReadLine ();
šírka = (tepl. dĺžka + 1) / 7;
Výška obrázka je počet riadkov v súbore:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
výška ++;
}
výška ++;
Posuňte ukazovateľ čítania v súbore na začiatok:
txtFile. DiscardBufferedData ();
Vytvorte novú inštanciu triedy Bitmap:
Bitmapa bmp2 = nová bitmapa (šírka, výška);
Metódou split sme rozdelili prvky matice. Deklarujeme tri premenné bajtového typu - R, G, B. Pomocou metód Parse a Substring vyberieme farebné prvky osobitne.
Na vyplnenie pixelu v obrázku touto farbou použite metódu SetPixel (j, i, Color. FromArgb (R, G, B)), kde j, i sú súradnice obrázka, Color. FromArgb (R, G, B)) je metóda, ktorá vytvára štruktúru Color.
pre (int i = 0; i <výška; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
pre (int j = 0; j <šírka; j + +)
{
R = byte. Pars (podreťazec [j]. Podreťazec (0, 2), System. Globalization. NumberStyles. HexNumber)
G = byte. Pars (podreťazec [j]. Podreťazec (2, 2), System. Globalization. NumberStyles. HexNumber)
B = byte. Pars (podreťazec [j]. Podreťazec (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Teraz môžete obrázky uložiť. Ak pracujete v systéme WindowsForm, môžete použiť triedu SaveFileDialog:
SaveFileDialog saveImage = nový SaveFileDialog ();
saveImage. Filter = súbory bmp (*. bmp) | *. bmp | všetky súbory (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);