快速将Bitmap转换为BitmapSource wpf

我需要在30Hz处在Image组件上绘制图像。 我用这个代码:

 public MainWindow() { InitializeComponent(); Messenger.Default.Register(this, (bmp) => { ImageTarget.Dispatcher.BeginInvoke((Action)(() => { var hBitmap = bmp.GetHbitmap(); var drawable = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); DeleteObject(hBitmap); ImageTarget.Source = drawable; })); }); } 

问题是,使用此代码,我的CPU使用率约为80%,如果没有转换,则大约为6%。

那么为什么转换位图这么长?
是否有更快的方法(使用不安全的代码)?

这是一种方法(根据我的经验)至少比CreateBitmapSourceFromHBitmap快四倍。

它要求您设置生成的BitmapSource的正确PixelFormat

 public BitmapSource Convert(System.Drawing.Bitmap bitmap) { var bitmapData = bitmap.LockBits( new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat); var bitmapSource = BitmapSource.Create( bitmapData.Width, bitmapData.Height, bitmap.HorizontalResolution, bitmap.VerticalResolution, PixelFormats.Bgr24, null, bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride); bitmap.UnlockBits(bitmapData); return bitmapSource; } 

我在克莱门斯回答之前回答:

 [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)] public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); WriteableBitmap writeableBitmap = new WriteableBitmap(1280, 1024, 96.0, 96.0, PixelFormats.Bgr24, null); public MainWindow() { InitializeComponent(); ImageTarget.Source = writeableBitmap; Messenger.Default.Register(this, (bmp) => { ImageTarget.Dispatcher.BeginInvoke((Action)(() => { BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); writeableBitmap.Lock(); CopyMemory(writeableBitmap.BackBuffer, data.Scan0, (writeableBitmap.BackBufferStride * bmp.Height)); writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, bmp.Width, bmp.Height)); writeableBitmap.Unlock(); bmp.UnlockBits(data); })); }); } 

现在我的CPU使用率约为15%