2009-10-30 13 views
10

पर हैंडल जारी नहीं करता है। मैं एक बहु-छवि टिफ़ फ़ाइल में एकाधिक मल्टी-छवि टिफ़ फ़ाइलों में शामिल हूं और स्रोत टिफ़ फ़ाइलों को हटाने में समस्या है, क्योंकि छवि वर्ग उन पर हैंडल पकड़ना जारी है।छवि का उपयोग करना। FromFile फ़ाइल

मैं Image.FromFile के माध्यम से एक टिफ छवि पढ़ रहा हूँ:

Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile); 

जो बाद मैं अन्य सभी टिफ छवियों उसी तरह पढ़ सकते हैं और उन्हें जिसके परिणामस्वरूप टिफ छवि के लिए जोड़ देते हैं।

जब मैं मैं संदर्भ जारी करने के लिए और परिणामी फ़ाइल को बचाने के लिए इस कोड का उपयोग समाप्त:

ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush); 
resultTiff.SaveAdd(ep); 
resultTiff.Dispose(); 

अब समस्या है कि फ़ाइलें पर संभाल अभी भी मौजूद है (और इसलिए फ़ाइलें हटाया नहीं जा सकता) जब तक कि resultTiff.Dispose() कॉल के बाद मैं GC.Collect() पर कॉल करता हूं।

आप कल्पना कर सकते हैं कि मुझे जीसी को कॉल करके बहुत सहज महसूस नहीं होता है, तो क्या यह हासिल करने का कोई और तरीका है?

उत्तर

17

सबसे अच्छा तरीका है Image.FromFile के साथ इस मुद्दे को हल करने के जिसमें यह पत्ते फ़ाइल खुला संभालती बजाय Image.FromStream उपयोग करने के लिए है।

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
{ 
    using (Image original = Image.FromStream(fs)) 
    { 
     ... 

एक स्पष्ट निपटान(), एक का उपयोग कर() बयान का उपयोग करना या अशक्त करने के लिए मान सेट मुद्दे को हल नहीं करता है जब तक एक कचरा संग्रहण होता है। एक कचरा संग्रह होने के लिए मजबूर करना आम तौर पर एक बुरा विचार है।

+2

+1। 'Image.FromFile 'हमेशा सही चीज़ नहीं करता है। फ़ाइल स्ट्रीम मैन्युअल रूप से खोलकर इसे बदलकर और फिर से बिटमैप लोड करने से आपको कुछ और लचीलापन मिल जाता है। – stakx

+0

किसी कारण से 'फाइलस्ट्रीम' अभी भी मुझे एक ही समस्या दे रहा था। इसके बजाय मैंने 'Image.FromStream (नई मेमोरीस्ट्रीम (फ़ाइल। रीड ऑलबाइट्स (पथ)) का उपयोग किया), 'जो अच्छी तरह से काम करता था। – William

1

आप कोशिश कर सकते हैं:

resultTiff = null; 
+0

उतना गधा जितना आपको ऐसा करने की आवश्यकता नहीं है - यह काम करता है। मेरे पास एक छवि ऐप था जिसने लूप में 1000 की छवियों को लोड किया और उन्हें संसाधित किया। अगर मेरे पास लूप में 'img = null' नहीं था तो मुझे ओओएम त्रुटियां बहुत जल्दी मिल जाएंगी। – Pondidum

+0

@ पांडिअम: मुझे भी यह समस्या है। एक sidenote के रूप में, मुझे संदेह है कि यह अपर्याप्त स्मृति के कारण पूरी तरह से नहीं हो सकता है, लेकिन जीडीआई हैंडल की कमी के साथ भी। – stakx

5

या कोशिश:

Using(Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile)) 
{ 
    ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush); 
    resultTiff.SaveAdd(ep); 
} 
+1

'उपयोग' का उपयोग करते समय निश्चित रूप से एक अच्छी सिफारिश है, यह शायद गोरान की विशेष समस्या को हल नहीं करेगा। प्रश्न में दिए गए उदाहरण कोड पहले से ही 'निपटान' (गैर असाधारण परिस्थितियों में) कहते हैं। – LukeH

+0

आपकी प्रतिक्रिया के लिए धन्यवाद दोस्तों। यह अभी हुआ कि कोड में कहीं और गड़बड़ हुई थी, और जब मैंने तय किया कि बस मेरी समस्याओं का समाधान करने का उपयोग करें। मैं उन फ़ाइलों के संदर्भों का निपटारा नहीं कर रहा था जो मैं पहली फ़ाइल में _appending_ था। जब मैंने इसे सही किया, तो सबकुछ बढ़िया काम करना शुरू कर दिया। इस उत्तर के लिए – Goran

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