Kiekvienas bmp vaizdo taškas pateikia informaciją apie savo spalvą iš RGB modelio (spalvotas vaizdo modelis, kurį sudaro trys komponentai R - raudona, G - žalia, B - mėlyna). Patogiau saugoti RGB spalvų vertę šešioliktainiu formatu (šešioliktainiu skaičiumi), kai kiekvieno komponento vertė yra 00… FF. Derinys 000000 atitinka juodą, FFFFFF - baltą.
Norėdami pradėti, atidarykite vardų sritį Piešimas:
naudojant „System. Drawing“;
Sukurkime naują „Bitmap“klasės egzempliorių:
Bitmap bmp = new Bitmap ("c: / 1.bmp") / / c: / 1.bmp - vaizdo adresas
Norėdami išsaugoti taškų spalvų vertę, galite sukurti atskirą struktūrą, kurios laukai yra RGB komponentai, tačiau aš nusprendžiau naudoti spalvų klasę iš piešimo vardų srities. Norėdami gauti spalvą, mes naudojame „GetPixel“(x, y) metodą, kur x, y yra vaizdo taško koordinatės. Jei norite spalvai išsaugoti naudoti savo struktūrą, o ne „Color“klasės egzempliorių, galite naudoti metodą bmp. GetPixel (x, y).x, kad gautumėte vieną RGB komponentą, kur x yra R, G arba B.
Spalva [,] spalva = nauja Spalva [bmp. Plotis, bmp. Height];
už (int y = 0; y <bmp. Aukštis; y ++)
skirta (int x = 0; x <bmp. plotis; x ++)
{
spalva [x, y] = bmp. GetPixel (x, y);
}
Norėdami rašyti spalvų reikšmes į failą, naudojame klasę „StreamWriter“. Kadangi Spalvos egzemplioriaus R, G, B elementai yra baitų tipo, mes juos konvertuojame naudojant ToString ("X2") metodą į eilutės tipą, kuriame bus saugomos RGB elementų šešiakampės vertės.
„StreamWriter“steamWriter = naujas „StreamWriter“(„c: / 1.txt“);
už (int y = 0; y <bmp. Aukštis; y ++)
{
skirta (int x = 0; x <bmp. plotis; x ++)
{
steamWriter. Write (spalva [x, y]. R. ToString ("X2"));
steamWriter. Write (spalva [x, y]. G. ToString ("X2"));
steamWriter. Write (spalva [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Uždaryti ();
Dabar atlikime atvirkštinę operaciją - konvertuokite gautą teksto failą į vaizdą.
„StreamReader“pagalba mes perskaitėme informaciją iš failo.
StreamReader txtFile = new StreamReader ("c: / 1.txt");
Mes apskaičiuojame vaizdo plotį ir aukštį. Kadangi kiekviename taške yra 6 simboliai ir 1 tarpas, o pabaigoje nėra tarpo, plotiui apskaičiuoti naudojame šią formulę:
temp = txtFile. ReadLine ();
plotis = (temp. Ilgis + 1) / 7;
Vaizdo aukštis yra failo eilučių skaičius:
o (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
aukštis ++;
}
aukštis ++;
Perkelkite failo skaitymo rodyklę į pradžią:
txtFile. DiscardBufferedData ();
Sukurkite naują „Bitmap“klasės egzempliorių:
Bitmap bmp2 = new Bitmap (plotis, aukštis);
Naudodami padalijimo metodą, padalijame matricos elementus. Deklaruojame tris baito tipo kintamuosius - R, G, B. Naudodami Parse ir Substring metodus, atskirai pasirinkite spalvų elementus.
Norėdami užpildyti vaizdo tašką šioje spalvoje, naudokite „SetPixel“(j, i, Color. FromArgb (R, G, B)) metodą, kur j, i yra vaizdo koordinatės, Color. FromArgb (R, G, B) yra metodas, sukuriantis struktūrą Spalva.
už (int i = 0; i <aukštis; i + +)
{
temp = txtFile2. ReadLine ();
eilutė substring = temp. Split ('');
už (int j = 0; j <plotis; j + +)
{
R = baitas. Parse (substring [j]. Substring (0, 2), System. Globalization. NumberStyles. HexNumber)
G = baitas. Parse (substring [j]. Substring (2, 2), System. Globalization. NumberStyles. HexNumber)
B = baitas. Parse (eilutė [j]. Substringa (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Dabar galite išsaugoti vaizdus. Jei dirbate „WindowsForm“, galite naudoti klasę „SaveFileDialog“:
SaveFileDialog saveImage = new SaveFileDialog ();
saveImage. Filter = bmp failai (*. bmp) | *. bmp | visi failai (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);