2010-03-12 4 views
5

मेरे पास एक तृतीय पक्ष डीएल है जो बिटमैप उत्पन्न करता है और इसके संदर्भ को वापस भेजता है। अगर मैं एक सिस्टम उत्पन्न करता हूं। Windows.Media.Imaging.BitmapSource तुरंत इसके बाहर तो सब ठीक हो जाता है। लेकिन अगर मैं (कुछ ही सेकंड और कई समारोह कॉल के बाद) संदर्भ और बाद में बचाने मैं Bitmapsource उत्पन्न करने के लिए प्रयास करते हैं, मैंसिस्टम गुजर रहा है। कक्षा पुस्तकालयों में ड्रॉइंग। बिटमैप अविश्वसनीय है?

System.AccessViolationException उपयोगकर्ता कोड
संदेश = पढ़ने के लिए प्रयास किया गया द्वारा बिना क्रिया था या संरक्षित स्मृति लिखें। यह अक्सर संकेत है कि अन्य स्मृति दूषित है। स्रोत = "System.Drawing"

जब कर रही:

System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
    bmp.GetHbitmap(), 
    IntPtr.Zero, 
    Int32Rect.Empty, 
    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 

क्या गलत यहाँ जा रहा पर कोई सुराग? कोई संकेतक उपयोगी होगा। धन्यवाद।

उत्तर

3

मुझे बिटमैप्स के साथ बड़ी समस्या थी और उल्लंघन का भी उपयोग किया गया था। जो मैं मानता हूं वह यह है कि कुछ बिटमैप कन्स्ट्रक्टर फ़ाइल हैंडल को तब खोलते हैं जब उन्हें नहीं करना चाहिए। इस प्रकार, जो प्रोग्राम आप चला रहे हैं वह पता लगाता है कि फाइलें उपयोग में हैं, जब वे नहीं होनी चाहिए।

मुझे अंत में एक समाधान पता चला कि मैं मूल बिटमैप की प्रति बना देता हूं और फिर मूल का निपटान करता हूं। यहाँ मेरी कोड, मूल बिटमैप के संकल्प को बरकरार रखता है जो है:

Bitmap Temp = new Bitmap(inFullPathName); 
Bitmap Copy = new Bitmap(Temp.Width, Temp.Height); 
Copy.SetResolution(Temp.HorizontalResolution, Temp.VerticalResolution); 
using (Graphics g = Graphics.FromImage(Copy)) 
{ 
    g.DrawImageUnscaled(Temp, 0, 0); 
} 
Temp.Dispose(); 
return Copy; 

जाहिर है पहली पंक्ति के लिए, तुम्हारा बिटमैप अस्थायी होगा = MyThirdPartyDLL.GetBitmap(); या कुछ और। आप संकल्प के बारे में परवाह नहीं है, तो यह करने के लिए सरल किया जा सकता:

Bitmap Temp = MyThirdPartyDLL.GetBitmap(); 
Bitmap Copy = new Bitmap(Temp, Temp.Width, Temp.Height); 
Temp.Dispose(); 
return Copy; 

यह परिवर्तन करने के बाद, मैं फ़ाइल के सभी प्रकार मैं/हे, आदि, बिल्कुल ठीक, आशा है कि आप क्या कर सकते हैं ऐसा करने में सक्षम था वही।

+0

क्षमा करें, फ़ाइल की हैंडल के साथ इसका कोई संबंध नहीं है। सही स्पष्टीकरण के लिए एंड्रेस का जवाब देखें। हालांकि मुझे बगमैप की प्रतिलिपि बनाने के लिए आपके समाधान को पसंद आया (+1)। यदि मिशेल 153 के आंतरिक डेटा संरचनाओं को बिटमैप स्रोत के बजाय बिटमैप की आवश्यकता होती है तो उसे आपके जैसे कोड का उपयोग करना चाहिए। यदि नहीं, तो वह एक नया बिटमैप बनाने के बजाय तुरंत बिटमैपसोर्स बनाकर बेहतर सेवा प्रदान करेगा। –

+1

हाय ब्रांडी, आपके सुझाए गए काम एक गीत की तरह :)। धन्यवाद! मैं वही काम करने की कोशिश कर रहा था लेकिन जिस तरह से मैं कर रहा था वह है: 'newBmp = oldBmp.Clone(); 'क्लोन के दस्तावेज ने कहा "इस छवि की एक सटीक प्रति बनाता है।", इसलिए मैंने सोचा कि मैंने गहरी प्रतिलिपि की है। वास्तव में भ्रमित करने वाला यह है कि बिटमैप के निर्माता का दस्तावेज कहता है "निर्दिष्ट छवि से बिटमैप वर्ग का एक नया उदाहरण आरंभ करता है", और ऐसा लगता है कि यह मौजूदा छवि को लपेट रहा है, जब वास्तव में यह गहरी कर रहा है प्रतिलिपि :)। यह केवल मुझे है या यह दूसरों के लिए भी भ्रमित है। धन्यवाद दोस्तों – mishal153

+0

मदद करने के लिए खुशी हुई। :) – Brandi

4

मुझे लगता है कि यह इंगित करता है कि bmp.GetHBitmap द्वारा लौटाए गए हैंडल (ऑपरेटिंग सिस्टम द्वारा संचालित संसाधन के संदर्भ में संदर्भ का संदर्भ अब मान्य नहीं है - संभवतः एक निपटान कहीं कहलाता है या ऐसा कुछ (आवश्यक नहीं है) हालांकि आपका कोड)।

मैं बिटमैप डेटा को जारी रखने का एक और तरीका उपयोग करने की अनुशंसा करता हूं जो हैंडल पर भरोसा नहीं करता है - संभवतः बिटमैप के बाइनरी डेटा को तुरंत स्ट्रीम करता है, और उसके बाद उस संदर्भ को फेंक देता है।

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