如何查看“原始”PNG图像数据

时间:2008-12-08 20:16:24

标签: .net png c#-2.0 bmp

我正在尝试编写一个将48位每像素PNG文件转换为专有(Bayer)格式的应用程序。

下面的代码(礼貌here)适用于某些PNG文件格式,但是当我尝试使用真正的48位PNG时,代码会抛出异常 - 是否有替代方案?

    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));
        }
    }

1 个答案:

答案 0 :(得分:4)

BMP编码器不支持48bpp格式。您可以使用Bitmap.LockBits()方法获得像素的裂缝。尽管PixelFormat的MSDN Library文章说48bpp被视为24bpp图像,但我确实看到这个代码有6个字节的像素:

  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);