Każdy piksel obrazu bmp niesie informację o swoim kolorze z modelu RGB (model kolorów obrazu, który składa się z trzech składowych R – czerwony, G – zielony, B – niebieski). Wygodniej jest przechowywać wartość koloru RGB w formacie szesnastkowym (szesnastkowym), gdzie wartość każdego składnika mieści się w zakresie 00…FF. Kombinacja 000000 odpowiada czerni, FFFFFF - bieli.
Aby rozpocząć, otwórzmy przestrzeń nazw Drawing:
za pomocą System. Drawing;
Stwórzmy nową instancję klasy Bitmap:
Bitmap bmp = new Bitmap ("c: / 1.bmp") / / c: / 1.bmp - adres obrazu
Do przechowywania wartości koloru piksela można stworzyć osobną strukturę, której polami są składowe RGB, ja jednak zdecydowałem się na użycie klasy Color z przestrzeni nazw Drawing. Aby uzyskać kolor, używamy metody GetPixel (x, y), gdzie x, y są współrzędnymi piksela obrazu. Jeśli chcesz użyć własnej struktury do przechowywania koloru, a nie instancji klasy Color, możesz użyć metody bmp. GetPixel (x, y).x, aby uzyskać pojedynczy składnik RGB, gdzie x to R, G lub B.
Kolor [,] kolor = nowy Kolor [bmp. Width, bmp. Height];
for (int y = 0; y <bmp. Height; y ++)
for (int x = 0; x <bmp. Szerokość; x ++)
{
kolor [x, y] = bmp. GetPixel (x, y);
}
Do zapisu wartości kolorów do pliku używamy klasy StreamWriter. Ponieważ elementy R, G, B instancji Color są typu byte, konwertujemy je za pomocą metody ToString („X2”) do typu string, który będzie przechowywać wartości szesnastkowe elementów RGB.
StreamWriter steamWriter = nowy StreamWriter ("c: / 1.txt");
for (int y = 0; y <bmp. Height; y ++)
{
for (int x = 0; x <bmp. Szerokość; x ++)
{
steamWriter. Write (kolor [x, y]. R. ToString ("X2"));
steamWriter. Write (kolor [x, y]. G. ToString ("X2"));
steamWriter. Write (kolor [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Zamknij ();
Teraz wykonajmy operację odwrotną - przekonwertuj powstały plik tekstowy na obraz.
Za pomocą StreamReadera odczytujemy informacje z pliku.
StreamReader txtFile = nowy StreamReader ("c: / 1.txt");
Obliczamy szerokość i wysokość obrazu. Ponieważ każdy piksel zajmuje 6 znaków i 1 przerwę, a na końcu nie ma przerwy, do obliczenia szerokości używamy następującego wzoru:
temp = txtFile. ReadLine();
szerokość = (temp. Długość + 1) / 7;
Wysokość obrazu to liczba wierszy w pliku:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine();
wysokość ++;
}
wysokość ++;
Przenieś wskaźnik odczytu w pliku na początek:
txtFile. DiscardBufferedData ();
Utwórz nową instancję klasy Bitmap:
Bitmapa bmp2 = nowa Bitmapa (szerokość, wysokość);
Metodą split dzielimy elementy macierzy. Deklarujemy trzy zmienne typu byte - R, G, B. Za pomocą metod Parse i Substring wybieramy elementy koloru osobno.
Aby wypełnić piksel na obrazie tym kolorem, użyj metody SetPixel (j, i, Color. FromArgb (R, G, B)), gdzie j, i to współrzędne obrazu Color. FromArgb (R, G, B) to metoda tworząca strukturę Color.
for (int i = 0; i <wysokość; i + +)
{
temp = txtFile2. ReadLine();
string substring = temp. Split ('');
for (int j = 0; j <szerokość; j + +)
{
R = bajt. Parse (podciąg [j]. Podciąg (0, 2), System. Globalization. NumberStyles. HexNumber)
G = bajt. Parse (podciąg [j]. Podciąg (2, 2), System. Globalization. NumberStyles. HexNumber)
B = bajt. Parse (podciąg [j]. Podciąg (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Teraz możesz zapisać obrazy. Jeśli pracujesz w WindowsForm, możesz użyć klasy SaveFileDialog:
SaveFileDialog saveImage = nowy SaveFileDialog ();
saveImage. Filter = pliki bmp (*. bmp) | *. bmp | Wszystkie pliki (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);