2016-10-04 5 views
3
var originalImageBytes = originalFile.FileBytes(); 

// Convert bytes to image 
Image originalImage; 
using (var ms = new MemoryStream(originalImageBytes)) 
{ 
    originalImage = Image.FromStream(ms); 
} 

// Convert back to byte array 
using (var ms = new MemoryStream()) 
{ 
    originalImage.Save(ms, ImageFormat.Png); 
    return ms.ToArray(); 
} 

그러나 프로그램이 최종 return ms.ToArray() 줄에 무기한 중단, 잘 작동 [] 컴퓨터가 바이트합니다.이미지 무기한 언제든지 <code>originalImageBytes</code> 반환

ms.ToArray()이 멈추는 이유는 무엇입니까?

답변

3

Stream을 사용하는 Image에서 이상한 동작과 관련이있을 수 있습니다. Image은 원하는대로 콘텐츠를 지연로드 할 수 있기 때문에 이미지를 다 끝낼 때까지 have to keep open the stream입니다.

실제로 Save은 (다음) 닫히기 및 처분을 트리거합니다 (MemoryStream). 스트림을 닫지 않으면 어떻게되는지보십시오.

+1

감사합니다. 만약 첫 번째 블록을'Bitmap originalImage; using (var ms = new MemoryStream (originalImageBytes)) { originalImage = new Bitmap (Image.FromStream (ms)); }'잘 동작합니다. –

+1

이것을 읽는 다른 사람에게는 위의 코드를 사용하지 마십시오! 제 생각 엔 .net 가비지 수집기가 망가 뜨리면 Image 객체에서 Bitmap 객체를 생성 할 때 이상한 동작이 발생합니다. 전체 메서드에 대해 원본 이미지 메모리 스트림을 열어 두는 것이 제대로 작동하는 유일한 방법입니다. –

+0

이미지가 Windows의 핸들에 크게 의존하기 때문입니다. 메모리 스트림을 닫으면 참조하는 메모리 블록이 지워집니다. –