🐕
BitmapSourceからBitmapへ変換するベストプラクティス
はじめに
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つのパターンで評価しました。
- BitmapDataを利用する(ベストプラクティス)
- BitmapEncoderでJPEGに保存してBitmapをロードする
- 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