Como faço para visualizar dados de imagem PNG 'raw'
Pergunta
Eu estou tentando escrever um aplicativo que converte arquivos PNG 48 bits por pixel para um formato proprietário (Bayer).
O código (cortesia aqui ) abaixo funciona muito bem para alguns formatos de arquivo PNG, mas quando tento uma bona fide 48 bits PNG o código lança uma exceção? - existe uma alternativa
static public byte[] BitmapDataFromBitmap(Bitmap objBitmap)
{
MemoryStream ms = new MemoryStream();
objBitmap.Save(ms, ImageFormat.BMP); // GDI+ exception thrown for > 32 bpp
return (ms.GetBuffer());
}
private void Bayer_Click(object sender, EventArgs e)
{
if (this.pictureName != null)
{
Bitmap bmp = new Bitmap(this.pictureName);
byte[] bmp_raw = BitmapDataFromBitmap(bmp);
int bpp = BitConverter.ToInt32(bmp_raw, 28); // 28 - BMP header defn.
MessageBox.Show(string.Format("Bits per pixel = {0}", bpp));
}
}
Solução
O codificador BMP não suporta 48bpp formatos. Você pode obter uma rachadura no pixels com o método () Bitmap.LockBits. Embora o artigo MSDN Library para PixelFormat diz que 48bpp é tratado como imagens 24bpp, eu de fato ver byte 6 pixels com este código:
Bitmap bmp = new Bitmap(@"c:\temp\48bpp.png");
BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadOnly, PixelFormat.Format48bppRgb);
// Party with bd.Scan0
//...
bmp.UnlockBits(bd);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow