Jokainen bmp-kuvan pikseli sisältää tietoja väreistään RGB-mallista (kuvan värimalli, joka koostuu kolmesta komponentista R - punainen, G - vihreä, B - sininen). RGB-väriarvo on kätevämpää tallentaa heksadesimaalimuodossa (heksadesimaali), jossa kunkin komponentin arvo on alueella 00… FF. Yhdistelmä 000000 vastaa mustaa, FFFFFF - valkoista.
Aloita avaamalla Piirustus-nimitila:
käyttämällä System. Drawing;
Luodaan uusi esiintymä Bitmap-luokasta:
Bittikartta bmp = uusi bittikartta ("c: / 1.bmp") / / c: / 1.bmp - kuvan osoite
Pikselivärien arvon tallentamiseksi voit luoda erillisen rakenteen, jonka kentät ovat RGB-komponentteja, mutta päätin käyttää Väriluokka Piirustus-nimiavaruudesta. Värin saamiseksi käytämme GetPixel (x, y) -menetelmää, jossa x, y ovat kuvapikselin koordinaatit. Jos haluat tallentaa värisi omalla rakenteellasi Väri-luokan esiintymän sijaan, voit käyttää bmp. GetPixel (x, y).x -menetelmää saadaksesi yhden RGB-komponentin, jossa x on R, G tai B.
Väri [,] väri = uusi Väri [bmp. Width, bmp. Height];
varten (int y = 0; y <bmp. Height; y ++)
for (int x = 0; x <bmp. leveys; x ++)
{
väri [x, y] = bmp. GetPixel (x, y);
}
Väriarvojen kirjoittamiseen tiedostoon käytämme StreamWriter-luokkaa. Koska Väri-esiintymän R, G, B-elementit ovat tavutyyppisiä, muunnamme ne ToString ("X2") -menetelmällä merkkijonotyypiksi, joka tallentaa RGB-elementtien hex-arvot.
StreamWriter steamWriter = uusi StreamWriter ("c: / 1.txt");
varten (int y = 0; y <bmp. Height; y ++)
{
for (int x = 0; x <bmp. leveys; x ++)
{
steamWriter. Write (väri [x, y]. R. ToString ("X2"));
steamWriter. Write (väri [x, y]. G. ToString ("X2"));
steamWriter. Write (väri [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Sulje ();
Suoritetaan nyt käänteinen toimenpide - muunnetaan saatu tekstitiedosto kuvaksi.
StreamReaderin avulla luemme tietoja tiedostosta.
StreamReader txtFile = uusi StreamReader ("c: / 1.txt");
Laskemme kuvan leveyden ja korkeuden. Koska jokaisessa pikselissä on 6 merkkiä ja yksi aukko, eikä lopussa ole aukkoa, käytämme seuraavaa kaavaa leveyden laskemiseen:
temp = txtFile. ReadLine ();
leveys = (temp. pituus + 1) / 7;
Kuvan korkeus on tiedoston rivien määrä:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
korkeus ++;
}
korkeus ++;
Siirrä tiedoston luettu osoitin alkuun:
txtFile. DiscardBufferedData ();
Luo uusi Bitmap-luokan ilmentymä:
Bittikartta bmp2 = uusi bittikartta (leveys, korkeus);
Jakomenetelmällä jaetaan matriisin elementit. Ilmoitamme kolme tavutyyppistä muuttujaa - R, G, B. Valitse värielementit Parse- ja Substring-menetelmillä.
Täytä kuvan pikseli tällä värillä käyttämällä SetPixel (j, i, Color. FromArgb (R, G, B)) -menetelmää, jossa j, i ovat kuvan koordinaatit, Color. FromArgb (R, G, B) on menetelmä, joka luo rakenteen Väri.
for (int i = 0; i <korkeus; i + +)
{
temp = txtFile2. ReadLine ();
merkkijono substing = temp. Split ('');
for (int j = 0; j <leveys; j + +)
{
R = tavu. Parse (substing [j]. Substring (0, 2), System. Globalization. NumberStyles. HexNumber)
G = tavu. Parse (substing [j]. Substring (2, 2), System. Globalization. NumberStyles. HexNumber)
B = tavu. Parse (substing [j]. Substring (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Nyt voit tallentaa kuvat. Jos työskentelet WindowsFormissa, voit käyttää SaveFileDialog-luokkaa:
SaveFileDialog saveImage = uusi SaveFileDialog ();
saveImage. Filter = bmp-tiedostot (*. bmp) | *. bmp | kaikki tiedostot (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);