Cada pixel de uma imagem bmp carrega informações sobre sua cor do modelo RGB (o modelo de cor da imagem, que consiste em três componentes R - vermelho, G - verde, B - azul). É mais conveniente armazenar o valor da cor RGB no formato hexadecimal (hexadecimal), onde o valor de cada componente está na faixa de 00… FF. A combinação 000000 corresponde ao preto, FFFFFF - ao branco.
Para começar, vamos abrir o namespace Drawing:
using System. Drawing;
Vamos criar uma nova instância da classe Bitmap:
Bitmap bmp = new Bitmap ("c: / 1.bmp") / / c: / 1.bmp - endereço da imagem
Para armazenar o valor da cor do pixel, você pode criar uma estrutura separada, cujos campos são componentes RGB, mas decidi usar a classe Color do namespace Drawing. Para obter a cor, usamos o método GetPixel (x, y), onde x, y são as coordenadas do pixel da imagem. Se você quiser usar sua própria estrutura para armazenar a cor, em vez de uma instância da classe Color, você pode usar o método bmp. GetPixel (x, y).x para obter um único componente RGB, onde x é R, G ou B.
Cor [,] color = nova cor [bmp. Width, bmp. Height];
para (int y = 0; y <bmp. Height; y ++)
para (int x = 0; x <bmp. Width; x ++)
{
cor [x, y] = bmp. GetPixel (x, y);
}
Para gravar valores de cor em um arquivo, usamos a classe StreamWriter. Como os elementos R, G, B da instância Color são do tipo byte, nós os convertemos usando o método ToString ("X2") em um tipo de string que armazenará os valores hexadecimais dos elementos RGB.
StreamWriter steamWriter = new StreamWriter ("c: / 1.txt");
para (int y = 0; y <bmp. Height; y ++)
{
para (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (color [x, y]. R. ToString ("X2"));
steamWriter. Write (color [x, y]. G. ToString ("X2"));
steamWriter. Write (color [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Agora vamos realizar a operação inversa - converter o arquivo de texto resultante em uma imagem.
Com a ajuda do StreamReader, lemos as informações do arquivo.
StreamReader txtFile = new StreamReader ("c: / 1.txt");
Calculamos a largura e a altura da imagem. Como cada pixel possui 6 caracteres e 1 lacuna, e não há lacuna no final, usamos a seguinte fórmula para calcular a largura:
temp = txtFile. ReadLine ();
largura = (temp. Comprimento + 1) / 7;
A altura da imagem é o número de linhas no arquivo:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
altura ++;
}
altura ++;
Mova o ponteiro de leitura no arquivo para o início:
txtFile. DiscardBufferedData ();
Crie uma nova instância da classe Bitmap:
Bitmap bmp2 = novo Bitmap (largura, altura);
Usando o método de divisão, dividimos os elementos da matriz. Declaramos três variáveis do tipo byte - R, G, B. Usando os métodos Parse e Substring, selecione os elementos de cor separadamente.
Para preencher o pixel da imagem com esta cor, use o método SetPixel (j, i, Color. FromArgb (R, G, B)), onde j, i são as coordenadas da imagem, Color. FromArgb (R, G, B) é o método que cria a estrutura Color.
para (int i = 0; i <altura; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
para (int j = 0; j <largura; 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));
}
}
Agora você pode salvar as imagens. Se você estiver trabalhando no WindowsForm, poderá usar a classe SaveFileDialog:
SaveFileDialog saveImage = new SaveFileDialog ();
saveImage. Filter = arquivos bmp (*. bmp) | *. bmp | Todos os arquivos (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);