2009-10-30 18 views
10

Tek bir çoklu görüntülü tiff dosyasına birden çok görüntülü tiff dosyasının bir birleşimini yapıyorum ve Image t sınıfından dolayı kaynak tiff dosyalarını silmeyle ilgili bir sorun yaşıyorum Onları tutacak tutmaya devam ediyor.Image.FromFile bir dosyadaki tanıtıcıyı serbest bırakmıyor

Ben Image.FromFile üzerinden bir tiff görüntü okuyorum:

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

hangi sonra diğer tüm tiff görüntüleri aynı şekilde okumak ve elde tiff görüntü onları ekleyin.

Ben başvuruları serbest bırakmak için ve elde edilen dosyayı kaydetmek için bu kodu kullanın bitince:

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

Şimdi problem dosyaları üzerinde tanıtıcı hala var olduğunu (ve dolayısıyla dosyalar

silinemez edilir) resultTiff.Dispose() çağrısından sonra GC.Collect()'u aramadıkça.

GC'yi arayarak kendimi çok rahat hissetmediğimi düşünebilirsiniz, bunun için başka bir yol var mı?

resultTiff = null; 

cevap

17

iyi yolu Image.FromFile ile sorunu çözmek için dosya açık kolları yerine Image.FromStream kullanmaktır yaprakları burada. Açık bir Dispose(), bir kullanma() deyimini kullanarak veya bir çöp toplama olmuyor kadar sorunu çözmez null değeri ayarı

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

. Bir çöp koleksiyonunun gerçekleşmesini zorlamak genellikle kötü bir fikirdir.

+2

+1. Image.FromFile, her zaman doğru olanı yapmaz. Bir dosya akışını manuel olarak açarak ve ardından bitmap'i oradan yükleyerek değiştirmek size biraz daha esneklik sağlar. – stakx

+0

Herhangi bir nedenle 'FileStream' hala bana aynı sorunu veriyordu. Bunun yerine, iyi çalıştı olan Image.FromStream (yeni MemoryStream (File.ReadAllBytes (yol))) 'yi kullandım. – William

1

Deneyebilirsin

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

Bunu yapmak zorunda olmamanız gerektiği kadar çok - işe yarıyor. Bir döngüde 1000 resim yükleyen ve bunları işleyen bir görüntü uygulaması vardı. Eğer bende img = null 'yoksa, OOM hatalarını çok çabuk alırdım. – Pondidum

+0

@Pondium: Ben de bu problemi yaşadım. Bir sidenote olarak, bunun sadece yetersiz bellekten kaynaklanabileceğinden değil, aynı zamanda GDI saplarından da kaynaklanabileceğinden şüpheleniyorum. – stakx

5

Veya deneyin:

+1

'using' kullanırken kesinlikle iyi bir öneridir, muhtemelen Goran'ın özel problemini çözmeyecektir. Soruda verilen örnek kod zaten "Kullanmayın" (istisnai olmayan durumlarda). – LukeH

+0

Cevabınız için teşekkürler. Sadece kodda başka bir yerde bir aksaklık oldu ve ben sadece Dispose kullanarak bu sorunları giderdim. İlk dosyaya _appending_ olduğum dosyalara atıfta bulunmuyordum. Bunu düzelttiğimde her şey harika çalışmaya başladı. Bu cevap için – Goran

İlgili konular