2009-10-30 4 views
10

하나의 다중 이미지 TIFF 파일에 여러 개의 다중 이미지 TIFF 파일을 조인하고 원본 TIFF 파일을 삭제하는 데 문제가 있습니다. Image 클래스 그 (것)들에 손잡이를 붙드는 것을 계속한다.Image.FromFile을 사용하여 파일 핸들을 해제하지 않습니다.

나는 Image.FromFile를 통해 TIFF 이미지를 읽고 있어요 :

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

가 그 후에 나는 다른 모든 TIFF 이미지 같은 방법으로 읽고 결과 TIFF 이미지에 추가합니다.

내가 참조를 해제하고 결과 파일을 저장하려면이 코드를 사용이 끝나면 :

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

가 이제 문제는 파일 의 핸들이 여전히 존재 함을는 (따라서 파일이

을 삭제할 수 없습니다됩니다) resultTiff.Dispose() 호출 후 GC.Collect()을 호출하지 않는 한.

내가 GC를 호출하는 것에 익숙하지 않다는 것을 상상할 수 있습니다. 다른 방법이 있습니까?

resultTiff = null; 

답변

17

가장 좋은 방법을 Image.FromFile와 함께 문제를 해결하기 위해이 파일이 열려 처리 대신 Image.FromStream을 사용하는 것입니다 잎 것을 특징으로한다. 명시 적으로 폐기()하는 사용() 문을 사용하거나 가비지 콜렉션이 발생할 때까지 문제가 해결되지 않는 null로 값을 설정

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

. 가비지 콜렉션을 강제 실행하는 것은 일반적으로 나쁜 생각입니다.

+2

+1입니다. 'Image.FromFile'은 항상 옳은 일을하는 것은 아닙니다. 수동으로 파일 스트림을 열고 비트 맵을로드하여 대체하면 유연성이 높아집니다. – stakx

+0

어떤 이유로 'FileStream'은 여전히 ​​저에게 같은 문제를 안겨주었습니다. 대신 나는'Image.FromStream (새로운 MemoryStream (File.ReadAllBytes (path))')를 사용했다. – William

1

당신이 시도 할 수

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

엉덩이가 이렇게해야 할 필요가 없으므로 작동합니다. 루프의 이미지를 1000 개로드하고 처리 한 이미지 앱이 있습니다. 루프에'img = null'이 없으면 매우 빨리 OOM 오류가 발생합니다. – Pondidum

+0

@Pondium : 나는 그 문제도 가지고있다. sidenote로서, 나는 그것이 단지 메모리 부족으로 인한 것이 아니라 GDI 핸들 부족으로 인한 것일 수도 있다고 생각합니다. – stakx

5

을 또는 시도 :

+1

'using '을 사용하는 것이 좋은 추천이지만 확실히 Goran의 특별한 문제는 해결되지 않습니다. 질문에 주어진 예제 코드는 이미 예외적 인 상황에서'Dispose'를 호출합니다. – LukeH

+0

답변 해 주셔서 감사합니다. 방금 코드의 다른 부분에서 결함이 발생하여 Dispose를 사용하여 문제를 해결했습니다. 첫 번째 파일에 내가 _appending_했던 파일에 대한 참조를 삭제하지 않았습니다. 이 문제를 바로 잡으면 모든 것이 잘 작동하기 시작했습니다. 이 대답은 – Goran

관련 문제