Každý pixel obrazu bmp nese informace o své barvě z modelu RGB (barevný model obrazu, který se skládá ze tří složek R - červená, G - zelená, B - modrá). Je pohodlnější ukládat hodnoty barev RGB v hexadecimálním formátu (šestnáctkově), kde je hodnota každé komponenty v rozsahu 00… FF. Kombinace 000000 odpovídá černé, FFFFFF - bílé.
Nejprve otevřete jmenný prostor Kreslení:
pomocí System. Drawing;
Vytvořme novou instanci třídy Bitmap třídy:
Bitmapa bmp = nová bitmapa ("c: / 1.bmp") / / c: / 1.bmp - adresa obrázku
Chcete-li uložit hodnotu barvy pixelu, můžete vytvořit samostatnou strukturu, jejíž pole jsou komponenty RGB, ale rozhodl jsem se použít třídu Color z oboru názvů Drawing. K získání barvy použijeme metodu GetPixel (x, y), kde x, y jsou souřadnice obrazového pixelu. Pokud chcete k uložení barvy použít vlastní strukturu, nikoli instanci třídy Color, můžete použít metodu bmp. GetPixel (x, y).x k získání jedné komponenty RGB, kde x je R, G nebo B.
Color [,] color = new Color [bmp. Width, bmp. Height];
pro (int y = 0; y <bmp.výška; y ++)
for (int x = 0; x <bmp. Width; x ++)
{
color [x, y] = bmp. GetPixel (x, y);
}
K zápisu hodnot barev do souboru používáme třídu StreamWriter. Protože prvky R, G, B instance Color jsou bajtového typu, převedeme je pomocí metody ToString ("X2") na typ řetězce, který uloží hexadecimální hodnoty prvků RGB.
StreamWriter steamWriter = nový StreamWriter ("c: / 1.txt");
pro (int y = 0; y <bmp.výška; y ++)
{
for (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (barva [x, y]. R. ToString ("X2"));
steamWriter. Write (barva [x, y]. G. ToString ("X2"));
steamWriter. Write (barva [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Nyní provedeme obrácenou operaci - převeďte výsledný textový soubor na obrázek.
S pomocí StreamReaderu čteme informace ze souboru.
StreamReader txtFile = nový StreamReader ("c: / 1.txt");
Vypočítáme šířku a výšku obrázku. Protože každý pixel má 6 znaků a 1 mezeru a na konci není mezera, vypočítáme šířku pomocí následujícího vzorce:
temp = txtFile. ReadLine ();
width = (temp. Length + 1) / 7;
Výška obrázku je počet řádků v souboru:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
výška ++;
}
výška ++;
Přesuňte ukazatel čtení v souboru na začátek:
txtFile. DiscardBufferedData ();
Vytvořte novou instanci třídy Bitmap:
Bitmapa bmp2 = nová bitmapa (šířka, výška);
Pomocí metody split jsme rozdělili prvky matice. Deklarujeme tři proměnné typu bytu - R, G, B. Pomocí metod Parse a Substring vyberte barevné prvky samostatně.
K vyplnění pixelu v obrázku touto barvou použijte metodu SetPixel (j, i, Color. FromArgb (R, G, B)), kde j, i jsou souřadnice obrázku, Color. FromArgb (R, G, B) je metoda, která vytváří strukturu Color.
pro (int i = 0; i <výška; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
pro (int j = 0; j <šířka; j + +)
{
R = byte.parse (podřetězec [j]. Podřetězec (0, 2), System. Globalization. NumberStyles. HexNumber)
G = byte.parse (podřetězec [j]. Podřetězec (2, 2), System. Globalization. NumberStyles. HexNumber)
B = byte.parse (podřetězec [j]. Podřetězec (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Nyní můžete obrázky uložit. Pokud pracujete ve WindowsForm, můžete použít třídu SaveFileDialog:
SaveFileDialog saveImage = nový SaveFileDialog ();
saveImage. Filter = soubory bmp (*. bmp) | *. bmp | všechny soubory (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);