Creating a BitmapImage WPF

前端 未结 1 897
自闭症患者
自闭症患者 2021-01-14 10:09

I have a ushort[] containing image data I need to display on screen, at the minute I am creating a Windows.System.Drawing.Bitmap, and converting this to a BitmapImage but th

相关标签:
1条回答
  • My previous method for converting Bitmap to BitmapImage was:

    MemoryStream ms = new MemoryStream(); 
    bitmap.Save(ms, ImageFormat.Png); 
    ms.Position = 0; 
    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.StreamSource = ms; 
    bi.EndInit();
    

    I was able to speed it up using

    Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), 
                                          IntPtr.Zero, 
                                          Int32Rect.Empty,
                                          System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
    

    EDIT: anyone using this should know that bitmap.GetHbitmap creates an unmanaged object lying around, since this is unmanaged it wont be picked up by the .net garbage collector and must be deleted to avoid a memory leak, use the following code to solve this:

        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);
    
        IntPtr hBitmap = bitmap.GetHbitmap();
        try
        {
            imageSource = Imaging.CreateBitmapSourceFromHBitmap(hBitmap,
                                                                IntPtr.Zero,
                                                                Int32Rect.Empty,
                                                                System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
        }
        catch (Exception e) { }
        finally
        {
            DeleteObject(hBitmap);
        }
    

    (its not very neat having to import a dll like like but this was taken from msdn, and seems to be the only way around this issue - http://msdn.microsoft.com/en-us/library/1dz311e4.aspx )

    0 讨论(0)
提交回复
热议问题