Jak Převést Obrázky RGB Na Text

Jak Převést Obrázky RGB Na Text
Jak Převést Obrázky RGB Na Text

Video: Jak Převést Obrázky RGB Na Text

Video: Jak Převést Obrázky RGB Na Text
Video: Tahle aplikace je SUPER! 2024, Smět
Anonim

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é.

Jak převést obrázky RGB na text
Jak převést obrázky RGB na text

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);

Doporučuje: