Ogni pixel di un'immagine bmp trasporta informazioni sul suo colore dal modello RGB (il modello di colore dell'immagine, che consiste di tre componenti R - rosso, G - verde, B - blu). È più conveniente memorizzare il valore del colore RGB in formato esadecimale (esadecimale), dove il valore di ciascun componente è compreso nell'intervallo 00…FF. La combinazione 000000 corrisponde al nero, FFFFFF - al bianco.
Per iniziare, apriamo lo spazio dei nomi Drawing:
utilizzando System. Drawing;
Creiamo una nuova istanza della classe Bitmap:
Bitmap bmp = nuovo Bitmap ("c: / 1.bmp") / / c: / 1.bmp - indirizzo immagine
Per memorizzare il valore del colore del pixel, puoi creare una struttura separata, i cui campi sono componenti RGB, ma ho deciso di utilizzare la classe Color dallo spazio dei nomi Drawing. Per ottenere il colore, usiamo il metodo GetPixel (x, y), dove x, y sono le coordinate del pixel dell'immagine. Se vuoi usare la tua struttura per memorizzare il colore, piuttosto che un'istanza della classe Color, puoi usare il metodo bmp. GetPixel (x, y).x per ottenere un singolo componente RGB, dove x è R, G, o B.
Colore [,] colore = nuovo Colore [bmp. Width, bmp. Height];
for (int y = 0; y <bmp. Altezza; y ++)
for (int x = 0; x <bmp. Larghezza; x ++)
{
colore [x, y] = bmp. GetPixel (x, y);
}
Per scrivere i valori del colore in un file, utilizziamo la classe StreamWriter. Poiché gli elementi R, G, B dell'istanza Color sono di tipo byte, li convertiamo utilizzando il metodo ToString ("X2") in un tipo stringa che memorizzerà i valori esadecimali degli elementi RGB.
StreamWriter steamWriter = nuovo StreamWriter ("c: / 1.txt");
for (int y = 0; y <bmp. Altezza; y ++)
{
for (int x = 0; x <bmp. Larghezza; x ++)
{
steamWriter. Write (colore [x, y]. R. ToString ("X2"));
steamWriter. Write (colore [x, y]. G. ToString ("X2"));
steamWriter. Write (colore [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Ora eseguiamo l'operazione inversa: convertiamo il file di testo risultante in un'immagine.
Con l'aiuto di StreamReader leggiamo le informazioni dal file.
StreamReader txtFile = nuovo StreamReader ("c: / 1.txt");
Calcoliamo la larghezza e l'altezza dell'immagine. Poiché ogni pixel richiede 6 caratteri e 1 spazio vuoto, e non c'è spazio alla fine, usiamo la seguente formula per calcolare la larghezza:
temp = txtFile. ReadLine ();
larghezza = (temp. Lunghezza + 1) / 7;
L'altezza dell'immagine è il numero di righe nel file:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
altezza ++;
}
altezza ++;
Sposta il puntatore di lettura nel file all'inizio:
txtFile. DiscardBufferedData ();
Crea una nuova istanza della classe Bitmap:
Bitmap bmp2 = new Bitmap (larghezza, altezza);
Usando il metodo split, dividiamo gli elementi della matrice. Dichiariamo tre variabili del tipo byte: R, G, B. Usando i metodi Parse e Substring, seleziona gli elementi di colore separatamente.
Per riempire il pixel dell'immagine con questo colore, usa il metodo SetPixel (j, i, Color. FromArgb (R, G, B)), dove j, i sono le coordinate dell'immagine, Color. FromArgb (R, G, B) è il metodo che crea la struttura Color.
for (int i = 0; i <altezza; i + +)
{
temp = txtFile2. ReadLine ();
stringa sottostringa = temp. Split ('');
for (int j = 0; j <larghezza; j + +)
{
R = byte. Parse (sottostringa [j]. Sottostringa (0, 2), System. Globalization. NumberStyles. HexNumber)
G = byte. Parse (sottostringa [j]. Sottostringa (2, 2),
System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (sottostringa [j]. Sottostringa (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Ora puoi salvare le immagini. Se stai lavorando in WindowsForm puoi usare la classe SaveFileDialog:
SaveFileDialog saveImage = new SaveFileDialog ();
saveImage. Filter = file bmp (*. bmp) | *. bmp | Tutti i file (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);