Elke pixel van 'n bmp-beeld bevat inligting oor die kleur van die RGB-model (die kleurmodel van die prent, wat bestaan uit drie komponente R - rooi, G - groen, B - blou). Dit is gemakliker om RGB-kleurwaarde in heksformaat (heksadesimaal) op te slaan, waar die waarde van elke komponent tussen 00 … FF is. Die kombinasie 000000 stem ooreen met swart, FFFFFF - met wit.
Laat ons die tekening-naamruimte oopmaak om te begin:
gebruik van System. Drawing;
Kom ons skep 'n nuwe instansie van die Bitmap-klas:
Bitmap bmp = nuwe Bitmap ("c: / 1.bmp") / / c: / 1.bmp - beeldadres
Om die pixelkleurwaarde op te slaan, kan u 'n aparte struktuur skep waarvan die velde RGB-komponente is, maar ek het besluit om die Color-klas uit die tekening-naamruimte te gebruik. Om die kleur te kry, gebruik ons die GetPixel (x, y) metode, waar x, y die koördinate van die beeldpixel is. As u u eie struktuur wil gebruik om die kleur op te slaan in plaas van 'n geval van die Color-klas, kan u die metode bmp. GetPixel (x, y).x gebruik om 'n enkele RGB-komponent te kry, waar x R is, G, of B.
Kleur [,] kleur = nuwe Kleur [bmp. Width, bmp. Height];
vir (int y = 0; y <bmp. Hoogte; y ++)
vir (int x = 0; x <bmp. Breedte; x ++)
{
kleur [x, y] = bmp. GetPixel (x, y);
}
Om kleurwaardes na 'n lêer te skryf, gebruik ons die StreamWriter-klas. Aangesien die R-, G-, B-elemente van die Kleur-instansie van die byte-tipe is, skakel ons dit om met behulp van die ToString-metode ("X2") in 'n stringtipe wat die hex-waardes van die RGB-elemente sal stoor.
StreamWriter steamWriter = nuwe StreamWriter ("c: / 1.txt");
vir (int y = 0; y <bmp. Hoogte; y ++)
{
vir (int x = 0; x <bmp. Breedte; x ++)
{
steamWriter. Write (kleur [x, y]. R. ToString ("X2"));
steamWriter. Write (kleur [x, y]. G. ToString ("X2"));
steamWriter. Write (kleur [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Laat ons nou die omgekeerde bewerking uitvoer - omskep die resulterende tekslêer in 'n beeld.
Met behulp van StreamReader lees ons inligting uit die lêer.
StreamReader txtFile = nuwe StreamReader ("c: / 1.txt");
Ons bereken die breedte en hoogte van die prent. Aangesien elke pixel 6 karakters en 1 gaping het en daar geen gaping aan die einde is nie, gebruik ons die volgende formule om die breedte te bereken:
temp = txtFile. ReadLine ();
breedte = (temp. lengte + 1) / 7;
Beeldhoogte is die aantal lyne in die lêer:
terwyl (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
hoogte ++;
}
hoogte ++;
Beweeg die leeswyser in die lêer na die begin:
txtFile. DiscardBufferedData ();
Skep 'n nuwe instansie van die Bitmap-klas:
Bitmap bmp2 = nuwe Bitmap (breedte, hoogte);
Met behulp van die splitmetode verdeel ons die elemente van die matriks. Ons verklaar drie veranderlikes van die bytesoort - R, G, B. Kies die kleurelemente afsonderlik met behulp van die Parse- en Substring-metodes.
Gebruik die SetPixel (j, i, Color. FromArgb (R, G, B)) metode om die pixel in die afbeelding te vul, waar j, i die beeldkoördinate is, Color. FromArgb (R, G, B) is die metode wat die struktuur Kleur skep.
vir (int i = 0; i <hoogte; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
vir (int j = 0; j <breedte; j + +)
{
R = byte. Parse (substring [j]. Substring (0, 2), System. Globalization. NumberStyles. HexNumber)
G = byte. Parse (substring [j]. Substring (2, 2),
System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (substring [j]. Substring (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Nou kan u die beelde stoor. As u in WindowsForm werk, kan u die SaveFileDialog-klas gebruik:
SaveFileDialog saveImage = nuwe SaveFileDialog ();
saveImage. Filter = bmp-lêers (*. bmp) | *. bmp | Alle lêers (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);