Hver pixel i et bmp-billede bærer information om sin farve fra RGB-modellen (billedets farvemodel, der består af tre komponenter R - rød, G - grøn, B - blå). Det er mere praktisk at gemme RGB-farveværdi i hex-format (hexadecimal), hvor værdien af hver komponent er i området 00… FF. Kombinationen 000000 svarer til sort, FFFFFF - til hvid.
For at komme i gang, lad os åbne Tegne-navneområdet:
ved hjælp af System. Drawing;
Lad os oprette en ny forekomst af Bitmap-klassen:
Bitmap bmp = ny Bitmap ("c: / 1.bmp") / / c: / 1.bmp - billedadresse
For at gemme pixelfarveværdien kan du oprette en separat struktur, hvis felter er RGB-komponenter, men jeg besluttede at bruge Color-klassen fra tegningens navneområde. For at få farven bruger vi GetPixel (x, y) -metoden, hvor x, y er koordinaterne for billedpixelen. Hvis du vil bruge din egen struktur til at gemme farven snarere end en forekomst af Color-klassen, kan du bruge metoden bmp. GetPixel (x, y).x til at få en enkelt RGB-komponent, hvor x er R, G eller B.
Farve [,] farve = ny Farve [bmp. Bredde, bmp. Højde];
for (int y = 0; y <bmp. Højde; y ++)
for (int x = 0; x <bmp. Bredde; x ++)
{
farve [x, y] = bmp. GetPixel (x, y);
}
For at skrive farveværdier til en fil bruger vi StreamWriter-klassen. Da R-, G-, B-elementerne i farveforekomsten er af byte-typen, konverterer vi dem ved hjælp af ToString ("X2") -metoden til en strengtype, der gemmer hex-værdierne for RGB-elementerne.
StreamWriter steamWriter = ny StreamWriter ("c: / 1.txt");
for (int y = 0; y <bmp. Højde; y ++)
{
for (int x = 0; x <bmp. Bredde; x ++)
{
steamWriter. Write (farve [x, y]. R. ToString ("X2"));
steamWriter. Write (farve [x, y]. G. ToString ("X2"));
steamWriter. Write (farve [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Lad os nu udføre den omvendte operation - konverter den resulterende tekstfil til et billede.
Ved hjælp af StreamReader læser vi information fra filen.
StreamReader txtFile = ny StreamReader ("c: / 1.txt");
Vi beregner bredden og højden af billedet. Da hver pixel tager 6 tegn og 1 hul, og der ikke er noget hul i slutningen, bruger vi følgende formel til at beregne bredden:
temp = txtFile. ReadLine ();
bredde = (temp. længde + 1) / 7;
Billedhøjde er antallet af linjer i filen:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
højde ++;
}
højde ++;
Flyt læsemarkøren i filen til begyndelsen:
txtFile. DiscardBufferedData ();
Opret en ny forekomst af Bitmap-klassen:
Bitmap bmp2 = ny Bitmap (bredde, højde);
Ved hjælp af splitmetoden deler vi elementerne i matrixen. Vi erklærer tre variabler af bytetypen - R, G, B. Brug farve- og understrengningsmetoder til at vælge farveelementerne separat.
For at udfylde pixel i billedet med denne farve skal du bruge metoden SetPixel (j, i, Color. FromArgb (R, G, B)), hvor j, i er billedkoordinaterne, Color. FromArgb (R, G, B) er metoden, der skaber strukturen Farve.
for (int i = 0; i <højde; i + +)
{
temp = txtFile2. ReadLine ();
streng substring = temp. Split ('');
for (int j = 0; j <bredde; j + +)
{
R = byte. Parse (understreng [j]. Understreng (0, 2), System. Globalization. NumberStyles. HexNumber)
G = byte. Parse (understreng [j]. Understreng (2, 2), System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (understreng [j]. Understreng (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Nu kan du gemme billederne. Hvis du arbejder i WindowsForm, kan du bruge klassen SaveFileDialog:
SaveFileDialog saveImage = ny SaveFileDialog ();
saveImage. Filter = bmp-filer (*. bmp) | *. bmp | Alle filer (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);