BitmapSource
をBitmap
に変換する大量の人を見つけましたが、ImageSource
をBitmap
に変換するとどうなりますか?画像処理プログラムを作成していて、Image
要素に表示されている画像からビットマップを抽出する必要があります。誰でもこれを行う方法を知っていますか?
編集1:
BitmapImage
をBitmap
に変換するための関数です。コンパイラの設定で「安全でない」オプションを設定することを忘れないでください。
public static System.Drawing.Bitmap BitmapSourceToBitmap(BitmapSource srs)
{
System.Drawing.Bitmap btm = null;
int width = srs.PixelWidth;
int height = srs.PixelHeight;
int stride = width * ((srs.Format.BitsPerPixel + 7) / 8);
byte[] bits = new byte[height * stride];
srs.CopyPixels(bits, stride, 0);
unsafe
{
fixed (byte* pB = bits)
{
IntPtr ptr = new IntPtr(pB);
btm = new System.Drawing.Bitmap(width, height, stride, System.Drawing.Imaging.PixelFormat.Format1bppIndexed, ptr);
}
}
return btm;
}
次に、BitmapImage
を取得します。
RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
(int)inkCanvas1.ActualWidth,
(int)inkCanvas1.ActualHeight,
96d, 96d,
PixelFormats.Default);
targetBitmap.Render(inkCanvas1);
MemoryStream mse = new MemoryStream();
System.Windows.Media.Imaging.BmpBitmapEncoder mem = new BmpBitmapEncoder();
mem.Frames.Add(BitmapFrame.Create(targetBitmap));
mem.Save(mse);
mse.Position = 0;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = mse;
bi.EndInit();
次はそれを変換することです:
Bitmap b = new Bitmap(BitmapSourceToBitmap(bi));
実際には、安全でないコードを使用する必要はありません。 IntPtrを受け入れるCopyPixels
のオーバーロードがあります。
public static System.Drawing.Bitmap BitmapSourceToBitmap2(BitmapSource srs)
{
int width = srs.PixelWidth;
int height = srs.PixelHeight;
int stride = width * ((srs.Format.BitsPerPixel + 7) / 8);
IntPtr ptr = IntPtr.Zero;
try
{
ptr = Marshal.AllocHGlobal(height * stride);
srs.CopyPixels(new Int32Rect(0, 0, width, height), ptr, height * stride, stride);
using (var btm = new System.Drawing.Bitmap(width, height, stride, System.Drawing.Imaging.PixelFormat.Format1bppIndexed, ptr))
{
// Clone the bitmap so that we can dispose it and
// release the unmanaged memory at ptr
return new System.Drawing.Bitmap(btm);
}
}
finally
{
if (ptr != IntPtr.Zero)
Marshal.FreeHGlobal(ptr);
}
}
その例は私にとってうまくいきました:
public static Bitmap ConvertToBitmap(BitmapSource bitmapSource)
{
var width = bitmapSource.PixelWidth;
var height = bitmapSource.PixelHeight;
var stride = width * ((bitmapSource.Format.BitsPerPixel + 7) / 8);
var memoryBlockPointer = Marshal.AllocHGlobal(height * stride);
bitmapSource.CopyPixels(new Int32Rect(0, 0, width, height), memoryBlockPointer, height * stride, stride);
var bitmap = new Bitmap(width, height, stride, PixelFormat.Format32bppPArgb, memoryBlockPointer);
return bitmap;
}
あなたのImageSourceはBitmapSourceではありませんか?ファイルから画像をロードする場合は、そうする必要があります。
コメントに返信:
BitmapSourceである必要があるように思えますが、BitmapSourceはImageSourceのサブタイプです。 ImageSourceをBitmapSourceにキャストし、それらのブログ投稿の1つに従ってください。
BitmapSourceToBitmap
メソッドはまったく必要ありません。メモリストリームを作成した後、以下を実行してください。
mem.Position = 0;
Bitmap b = new Bitmap(mem);