fast converting Bitmap to BitmapSource wpf fast converting Bitmap to BitmapSource wpf wpf wpf

fast converting Bitmap to BitmapSource wpf


Here is a method that (to my experience) is at least four times faster than CreateBitmapSourceFromHBitmap.

It requires that you set the correct PixelFormat of the resulting BitmapSource.

public static 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;}


I answered myself before Clemens answer with :

[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<Bitmap>(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);        }));    });}

Now my CPU usage is about 15%