Ask a questionAsk a question
 

AnswerHow to dispose BitmapSource?

  • Monday, July 03, 2006 10:17 AMTom Nt Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     

    Hi all,

    How can I dispose BitmapSource (actually InteropBitmapSource)? 

    Example of memory leak:

     

                while (true)

                {

                    using (Bitmap bitmap = new Bitmap(1000, 1000))

                    {

                        BitmapSource source = Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(),

                            IntPtr.Zero, new Int32Rect(0, 0, bitmap.Width, bitmap.Height),

                            BitmapSizeOptions.FromEmptyOptions());

                    }

                    GC.Collect();

                    Console.Read();

                }

     

    Thanks for any hints.

     

    Tom

Answers

  • Tuesday, July 25, 2006 7:09 PMBrownie PointsMVP, ModeratorUsers MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     Answer

    When you call GetHbitmap you are responsible for calling DeleteObject to free its memory

     

    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    public static extern bool DeleteObject(IntPtr hObject);
    
           
    private void DemonstrateGetHbitmap() 
    {
        Bitmap bm = new Bitmap("Picture.jpg");
        IntPtr hBitmap = bm.GetHbitmap();
                 
        // Do something with hBitmap.
        DeleteObject(hBitmap);
    }
    

All Replies

  • Tuesday, July 25, 2006 4:18 PMBPAndrew Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     
    did you figure this out?  I'm having the exact same issue right now
  • Tuesday, July 25, 2006 7:09 PMBrownie PointsMVP, ModeratorUsers MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     Answer

    When you call GetHbitmap you are responsible for calling DeleteObject to free its memory

     

    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    public static extern bool DeleteObject(IntPtr hObject);
    
           
    private void DemonstrateGetHbitmap() 
    {
        Bitmap bm = new Bitmap("Picture.jpg");
        IntPtr hBitmap = bm.GetHbitmap();
                 
        // Do something with hBitmap.
        DeleteObject(hBitmap);
    }
    
  • Tuesday, July 25, 2006 8:08 PMRobert A. WlodarczykMSFT, ModeratorUsers MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     
    This is spot on.
  • Wednesday, July 26, 2006 12:56 AMBrownie PointsMVP, ModeratorUsers MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     
    Forgot to mention that the information (and code sample) was taken from the documentation for GetHbitmap.
  • Wednesday, September 20, 2006 8:19 PMTom Nt Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     
    Ok. Thanks. I did not check the documentation for Bitmap.GetHbitmap(), I just used IntelliSense:)
  • Tuesday, May 29, 2007 3:32 PMarkhivania 1983 Users MedalsUsers MedalsUsers MedalsUsers MedalsUsers Medals
     
    Whoops, CreateBitmapSourceFromHBitmap create copy of HBitmap?