问题描述
据我所知,从 BitmapSource 转换为 Bitmap 的唯一方法是通过不安全的代码......就像这样(来自 莱斯特 WPF 博客):
As far as I can tell the only way to convert from BitmapSource to Bitmap is through unsafe code... Like this (from Lesters WPF blog):
myBitmapSource.CopyPixels(bits, stride, 0);
unsafe
{
fixed (byte* pBits = bits)
{
IntPtr ptr = new IntPtr(pBits);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
width,
height,
stride,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb,ptr);
return bitmap;
}
}
反过来:
System.Windows.Media.Imaging.BitmapSource bitmapSource =
System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bitmap.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
框架中有没有更简单的方法?它不在那里的原因是什么(如果不是)?我认为它相当有用.
Is there an easier way in the framework? And what is the reason it isn't in there (if it's not)? I would think it's fairly usable.
我需要它的原因是因为我使用 AForge 在 WPF 应用程序中执行某些图像操作.WPF 想要显示 BitmapSource/ImageSource,但 AForge 可以处理位图.
The reason I need it is because I use AForge to do certain image operations in an WPF app. WPF wants to show BitmapSource/ImageSource but AForge works on Bitmaps.
推荐答案
通过使用 Bitmap.LockBits
并从 BitmapSource
复制像素,可以在不使用不安全代码的情况下做到这一点code> 直接到 Bitmap
It is possible to do without using unsafe code by using Bitmap.LockBits
and copy the pixels from the BitmapSource
straight to the Bitmap
Bitmap GetBitmap(BitmapSource source) {
Bitmap bmp = new Bitmap(
source.PixelWidth,
source.PixelHeight,
PixelFormat.Format32bppPArgb);
BitmapData data = bmp.LockBits(
new Rectangle(Point.Empty, bmp.Size),
ImageLockMode.WriteOnly,
PixelFormat.Format32bppPArgb);
source.CopyPixels(
Int32Rect.Empty,
data.Scan0,
data.Height * data.Stride,
data.Stride);
bmp.UnlockBits(data);
return bmp;
}
这篇关于BitmapSource 和 Bitmap 之间有什么好的转换方法吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!