Hver piksel av et bmp-bilde bærer informasjon om fargen fra RGB-modellen (fargemodellen til bildet, som består av tre komponenter R - rød, G - grønn, B - blå). Det er mer praktisk å lagre RGB-fargeverdi i hex-format (heksadesimal), hvor verdien til hver komponent er i området 00… FF. Kombinasjonen 000000 tilsvarer svart, FFFFFF - til hvitt.
For å komme i gang, la oss åpne tegneområdet:
ved hjelp av System. Drawing;
La oss lage en ny forekomst av Bitmap-klassen:
Bitmap bmp = ny Bitmap ("c: / 1.bmp") / / c: / 1.bmp - bildeadresse
For å lagre pikselfargeverdien, kan du opprette en egen struktur, hvis felt er RGB-komponenter, men jeg bestemte meg for å bruke fargeklassen fra tegningsnavnområdet. For å få fargen bruker vi GetPixel (x, y) -metoden, der x, y er koordinatene til bildepikslet. Hvis du vil bruke din egen struktur til å lagre fargen, i stedet for en forekomst av Color-klassen, kan du bruke bmp. GetPixel (x, y).x-metoden for å få en enkelt RGB-komponent, hvor x er R, G, eller B.
Farge [,] farge = ny Farge [bmp. Bredde, bmp. Høyde];
for (int y = 0; y <bmp. Høyde; y ++)
for (int x = 0; x <bmp. Bredde; x ++)
{
farge [x, y] = bmp. GetPixel (x, y);
}
For å skrive fargeverdier til en fil, bruker vi klassen StreamWriter. Siden R-, G-, B-elementene i Color-forekomsten er av byte-typen, konverterer vi dem ved hjelp av ToString-metoden ("X2") til en strengtype som vil lagre hexverdiene til RGB-elementene.
StreamWriter steamWriter = ny StreamWriter ("c: / 1.txt");
for (int y = 0; y <bmp. Høyde; y ++)
{
for (int x = 0; x <bmp. Bredde; x ++)
{
steamWriter. Write (farge [x, y]. R. ToString ("X2"));
steamWriter. Write (farge [x, y]. G. ToString ("X2"));
steamWriter. Write (farge [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
La oss nå utføre den omvendte operasjonen - konverter den resulterende tekstfilen til et bilde.
Ved hjelp av StreamReader leser vi informasjon fra filen.
StreamReader txtFile = ny StreamReader ("c: / 1.txt");
Vi beregner bredden og høyden på bildet. Siden hver piksel tar 6 tegn og 1 gap, og det ikke er noe gap på slutten, bruker vi følgende formel for å beregne bredden:
temp = txtFile. ReadLine ();
bredde = (temp. lengde + 1) / 7;
Bildehøyde er antall linjer i filen:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
høyde ++;
}
høyde ++;
Flytt lesepekeren i filen til begynnelsen:
txtFile. DiscardBufferedData ();
Opprett en ny forekomst av Bitmap-klassen:
Bitmap bmp2 = ny Bitmap (bredde, høyde);
Ved hjelp av delingsmetoden deler vi elementene i matrisen. Vi erklærer tre variabler av byte-typen - R, G, B. Ved hjelp av analyserings- og understrengningsmetodene velger du fargelementene separat.
For å fylle pixelen i bildet med denne fargen, bruk metoden SetPixel (j, i, Color. FromArgb (R, G, B)), der j, i er bildekoordinatene, Color. FromArgb (R, G, B) er metoden som skaper strukturen Color.
for (int i = 0; i <høyde; i + +)
{
temp = txtFile2. ReadLine ();
streng substring = temp. Split ('');
for (int j = 0; j <bredde; 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));
}
}
Nå kan du lagre bildene. Hvis du jobber i WindowsForm, kan du bruke SaveFileDialog-klassen:
SaveFileDialog saveImage = ny SaveFileDialog ();
saveImage. Filter = bmp filer (*. bmp) | *. bmp | Alle filer (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);