🐕

BitmapSourceからBitmapへ変換するベストプラクティス

2023/12/03に公開

はじめに

WPFで画像処理関連の開発をしているとBitmapとBitmapSourceの相互変換が頻繁に発生します。

ここではBitmapSourceからBitmapへの変換のベストプラクティスを整理しました。

ベストプラクティス

BitmapからBitmapDataを作って、BitmapSourceからCopyPixelsで書きだすのがベストです。

BitmapSource source = new BitmapImage(new Uri(new FileInfo("Color.jpg").FullName));

var bitmap = new Bitmap(
    source.PixelWidth,
    source.PixelHeight,
    PixelFormat.Format32bppPArgb);
var data = bitmap.LockBits(
    new Rectangle(Point.Empty, bitmap.Size),
    ImageLockMode.WriteOnly,
    PixelFormat.Format32bppPArgb);
try
{
    source.CopyPixels(
        Int32Rect.Empty,
        data.Scan0,
        data.Height * data.Stride,
        data.Stride);
    return bitmap;
}
finally
{
    bitmap.UnlockBits(data);
}

UnlockBitsをお忘れずに。

検証

今回は、下記の3つのパターンで評価しました。

  1. BitmapDataを利用する(ベストプラクティス)
  2. BitmapEncoderでJPEGに保存してBitmapをロードする
  3. BitmapEncoderでBMPに保存してBitmapをロードする

処理速度、メモリーの使用量どちらもBitmapData経由でコピーするのが好成績ですね。

BitmapEncoderのコード例

BitmapSource source = new BitmapImage(new Uri(new FileInfo("Color.jpg").FullName));

using var outStream = new MemoryStream();
var enc = new JpegBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(source));
enc.Save(outStream);
return new Bitmap(outStream);

Discussion