2011-12-29 10 views
7

मैं एक WPF एप्लिकेशन का उपयोग कर रहा हूं जो बिटमैपसोर्स का उपयोग करता है लेकिन मुझे कुछ मैनिपुलेशन करने की आवश्यकता है, लेकिन मुझे सिस्टम के कुछ हेरफेर करने की आवश्यकता है। ड्रॉइंग.बिटमैप्स।अप्रबंधित मेमोरी लीक

एप्लिकेशन के मेमोरी उपयोग को चलाने के दौरान बढ़ता है।

मैं इस कोड को स्मृति रिसाव को संकुचित होता है:

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap) 
{ 
      BitmapSource bms; 
      IntPtr hBitmap = bitmap.GetHbitmap(); 
      BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); 
      bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions); 
      bms.Freeze(); 
      return bms; 
} 

मुझे लगता है यह अप्रबंधित स्मृति नहीं ठीक से निपटाया जा रहा है, लेकिन मैं इसे मैन्युअल रूप से ऐसा करने का वैसे भी खोजने के लिए प्रतीत नहीं कर सकते हैं। किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद!

एलेक्स

+0

के संभावित डुप्लिकेट [WPF CreateBitmapSourceFromHBitmap स्मृति रिसाव] (http://stackoverflow.com/questions/1546091/wpf-createbitmapsourcefromhbitmap-memory-leak) – Pieniadz

उत्तर

9

आप अपने hBitmap पर DeleteObject(...) कॉल करने के लिए की जरूरत है। देखें: http://msdn.microsoft.com/en-us/library/1dz311e4.aspx

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap) 
{ 
    BitmapSource bms; 
    IntPtr hBitmap = bitmap.GetHbitmap(); 
    BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); 
    bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, 
     IntPtr.Zero, Int32Rect.Empty, sizeOptions); 
    bms.Freeze(); 

    // NEW: 
    DeleteObject(hBitmap); 

    return bms; 
} 
+3

मैं के बारे में बिल्कुल वैसा ही जवाब लिखने के लिए था;) यहाँ 'DeleteObject' विधि की घोषणा: ' [DllImport ("gdi32.dll")] स्थैतिक बाहरी बूल DeleteObject (IntPtr hObject); ' – ken2k

+0

@ केन 2k: और मैं बिल्कुल वही घोषणा जोड़ना चाहता था। धन्यवाद! – MusiGenesis

+0

बहुत बहुत धन्यवाद, जो मेरी समस्या हल करता है! – aforward

4

आप HBITMAP पर DeleteObject(hBitmap) कॉल करने की आवश्यकता:

private BitmapSource BitmaptoBitmapsource(System.Drawing.Bitmap bitmap) { 
     BitmapSource bms; 
     IntPtr hBitmap = bitmap.GetHbitmap(); 
     BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); 
     try { 
      bms = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions); 
      bms.Freeze(); 
     } finally { 
      DeleteObject(hBitmap); 
     } 
     return bms; 
} 
0

क्या आप बिटमैप हैंडल जारी कर रहे हैं?

MSDN (http://msdn.microsoft.com/en-us/library/1dz311e4.aspx)

आप GDI बिटमैप वस्तु के द्वारा प्रयोग किया स्मृति को मुक्त करने GDI DeleteObject विधि फोन करने के लिए जिम्मेदार हैं के अनुसार। जीडीआई बिटमैप्स के बारे में अधिक जानकारी के लिए, विंडोज जीडीआई दस्तावेज में बिटमैप्स देखें।

संबंधित मुद्दे