据我所知,从BitmapSource转换为Bitmap的唯一方法是通过不安全的代码…像这样(来自Lesters WPF博客):
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());
框架中有没有更简单的方法?它不在其中的原因是什么(如果没有)?我认为这是相当有用的。
我需要它的原因是因为我使用AForge在WPF应用程序中执行某些图像操作。WPF希望显示BitmapSource / ImageSource,但AForge可以在Bitmap上使用。
通过使用Bitmap.LockBits像素并将像素从BitmapSource直线复制到像素,可以在不使用不安全代码的情况下进行操作Bitmap
Bitmap.LockBits
BitmapSource
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; }