Pergunta

Preciso converter uma imagem PNG carregada de um arquivo em uma matriz de bits de 8 bits por pixel usada por outro dispositivo (programação incorporada).

Estou copiando o pixel por pixel em uma nova imagem criada com uma cor de 16 bits - Format16bppRgb565, mas eu preciso Format8bpp, que não está presente na estrutura .NET. (Eu não posso usar Format8bppIndexed Como o outro dispositivo não pode lidar com bitmaps indexados)

 Bitmap img = new Bitmap(imgPath);
 Bitmap img8 = new Bitmap(imgW, imgH, PixelFormat.Format16bppRgb565);
 for (int I = 0; I <= img.Width - 1; I++) {
     for (int J = 0; J <= img.Height - 1; J++) {
         img8.SetPixel(I, J, img.GetPixel(I, J));
     }
 }

Então, como posso converter uma imagem em uma matriz de 8 bits por pixel byte?

  • Posso usar o formato indexado de 8 bits e extrair os bytes? - Format8bppIndexed
  • Posso calcular as cores do pixel, reduzindo os valores de cor R, G, B para 8 bits?
  • Existe uma biblioteca C# que já faz isso?
  • "A maneira mais fácil é criar um novo bitmap de 8 bits e desenhar sua imagem de 24 bits para ele". - Como as?
Foi útil?

Solução

Embora eu não tenha certeza de como fazê -lo com baunilha C# você pode usar o Projeto FreeImage Bibliotecas para converter formatos de imagens:

O FreeImage é um projeto de biblioteca de código aberto para desenvolvedores que gostariam de oferecer suporte a formatos de imagem gráficos populares como PNG, BMP, JPEG, TIFF e outros, conforme necessário pelos aplicativos multimídia de hoje. O FreeImage é fácil de usar, rápido, com segurança, compatível com todas as versões de 32 bits de Windows e plataforma cruzada (funciona com o Linux e o Mac OS X).

Está escrito em C ++, mas tem bons invólucros .NET que você pode usar.

Outras dicas

Eu já fiz isso em um projeto de reconhecimento de padrões. Pesquisando alguns livros de processamento de imagens e reconhecimento de padrões, você pode encontrar essas soluções.

a) Se você deseja converter para a escala GreyScale, pode encontrar em geral duas soluções.

#1 Média dos canais RGB. - Você pode tomar valores de 8 bits para um canal único e calcular pixel = (r+g+b)/3

#2 Pegue apenas o componente verde. É melhor visualizado.

b) Se você deseja converter para a representação de cores de 8 bits, precisa usar uma tabela de cores. Você pode ver uma solução aqui http://www.codeproject.com/kb/graphics/image_bitdepth_conversion.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top