2

48ビット/ピクセルのPNGファイルを独自の(Bayer)形式に変換するアプリケーションを作成しようとしています。

以下のコード(ここで提供)は、一部の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));
        }
    }
4

1 に答える 1

4

BMP エンコーダーは 48bpp 形式をサポートしていません。Bitmap.LockBits() メソッドを使用して、ピクセルに亀裂を入れることができます。PixelFormat に関する MSDN ライブラリの記事では、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);
于 2008-12-08T20:46:05.680 に答える