web-dev-qa-db-ja.com

C#でのビットマップPixelFormatsの変換

ビットマップをPixelFormat.Format32bppRgbからPixelFormat.Format32bppArgbに変換する必要があります。

Bitmap.Cloneを使用したいと思っていましたが、機能していないようです。

Bitmap orig = new Bitmap("orig.bmp");
Bitmap clone = orig.Clone(new Rectangle(0,0,orig.Width,orig.Height), PixelFormat.Format24bppArgb);

上記のコードを実行してclone.PixelFormatを確認すると、PixelFormat.Format32bppRgbに設定されています。何が起こっていますか/どのようにフォーマットを変換しますか?

44
Jono

ずさんで、GDI +では珍しくありません。これにより修正されます:

Bitmap orig = new Bitmap(@"c:\temp\24bpp.bmp");
Bitmap clone = new Bitmap(orig.Width, orig.Height,
    System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

using (Graphics gr = Graphics.FromImage(clone)) {
    gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height));
}

// Dispose orig as necessary...
80
Hans Passant

何らかの理由で、ファイルパス、つまりBitmap bmp = new Bitmap("myimage.jpg");からBitmapを作成し、その上でClone()を呼び出した場合、返されるBitmapは変換されました。

ただし、古いBitmapから別のBitmapを作成すると、Clone()は意図したとおりに機能します。

次のようなものを試してください:

using (Bitmap oldBmp = new Bitmap("myimage.jpg"))
using (Bitmap newBmp = new Bitmap(oldBmp))
using (Bitmap targetBmp = newBmp.Clone(new Rectangle(0, 0, newBmp.Width, newBmp.Height), PixelFormat.Format32bppArgb))
{
    // targetBmp is now in the desired format.
}
30
Dan7
using (var bmp = new Bitmap(width, height, PixelFormat.Format24bppArgb))
using (var g = Graphics.FromImage(bmp)) {
  g.DrawImage(..);
}

そのように動作するはずです。 gにいくつかのパラメータを設定して、品質などの補間モードを定義したい場合があります。

7