2014-02-05 3 views
0

zip 파일에서 직접 이미지 소스를로드하는 방법은 무엇입니까?Wpf : 파일을 저장하지 않고 zip에서 이미지 소스로드

나는 DotNetZip을 사용합니다.

아래 2 코드 샘플.

코드 샘플 1은 이미지 파일을로드하고 표시하지 못합니다.

코드 샘플 1 MemoryStream에 zipEntry를로드하고 Imagesource로 사용할 BitmapImage를 만들지 만 실패합니다. ??? 테스트 용으로 memorystream에서 이미지를 저장하려고 시도하여 Zip 항목이로드되었는지 확인합니다. 제대로 저장됩니다

 MemoryStream memoryStream1 = new MemoryStream(); 

     ZipFile zip = ZipFile.Read(@"D:\myZipArcive.zip"); 

     ZipEntry myEntry = zip["myfile.jpg"]; 
     myEntry.Extract(memoryStream1); 
     memoryStream1.Close(); 

     System.IO.File.WriteAllBytes(@"D:\saved.jpg", memoryStream1.ToArray()); 
     //save file just for testing 

     BitmapImage src = new BitmapImage(); 
     src.BeginInit(); 
     src.CacheOption = BitmapCacheOption.OnLoad; 
     src.StreamSource = memoryStream1; 
     src.EndInit(); 

     myImage.Source = src as ImageSource; //no image is displayed 

내가 MemoryStream을에 파일을로드하고 BitmapImage를 생성이 코드 샘플은 succes에 함께 Imagesource로 사용할 수 있습니다. "형 'System.NotSupportedException'형식의 첫째 예외가가 mscorlib.dll에서 발생했습니다"

: 내가 디버그 메시지가 1 샘플에서 MemoryStream을, 내가 실행 예제 1에 문제가 있습니다

 FileStream fileStream = File.OpenRead(@"D:\myFile.jpg"); 

     MemoryStream memoryStream2 = new MemoryStream(); 
     memoryStream2.SetLength(fileStream.Length); 
     fileStream.Read(memoryStream2.GetBuffer(), 0, (int)fileStream.Length); 

     BitmapImage src = new BitmapImage(); 
     src.BeginInit(); 
     src.CacheOption = BitmapCacheOption.OnLoad; 
     src.StreamSource = memoryStream2;  
     src.EndInit(); 

     myImage.Source = src as ImageSource; //The image is displayed 

답변

1

스트림이 Extract 메소드에 의해 닫힌 것 같습니다.

var zipFile = ZipFile.Read(@"D:\myZipArcive.zip"); 
var zipEntry = zipFile["myfile.jpg"]; 
var zipStream = new MemoryStream(); 
zipEntry.Extract(zipStream); 

var bitmap = new BitmapImage(); 

using (var sourceStream = new MemoryStream(zipStream.ToArray())) 
{ 
    bitmap.BeginInit(); 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.StreamSource = sourceStream; 
    bitmap.EndInit(); 
} 

myImage.Source = bitmap; 

업데이트 : 당신은 그러나 첫 번째의 버퍼에서 두 번째 MemoryStream을을 만들 수 있습니다 당신은 사전에 이미지 버퍼의 압축되지 않은 크기를 알고 있기 때문에, 당신은 약간 수동으로 버퍼를 제공하여 성능을 향상시킬 수 있습니다 두 MemoryStreams가 작동하는지이 너무 작동

var buffer = new byte[zipEntry.UncompressedSize]; 
var zipStream = new MemoryStream(buffer); // here 
zipEntry.Extract(zipStream); 
... 
using (var sourceStream = new MemoryStream(buffer)) // and here 
... 
+0

헤이 클레멘스 감사합니다. 그것은 위대한 작품! –

+0

@ErikT 내 업데이트를 참조하십시오. 아마 그것은 조금 더 잘 수행됩니다. – Clemens

0

:

var zipFile = ZipFile.Read(@"D:\myZipArcive.zip"); 
var zipEntry = zipFile["myfile.jpg"]; 
var bitmap = new BitmapImage(); 
bitmap.BeginInit(); 
bitmap.CacheOption = BitmapCacheOption.OnLoad; 
bitmap.StreamSource = zipEntry.OpenReader(); 
bitmap.EndInit(); 
myImage.Source = bitmap; 
+0

몇 가지 테스트를 한 후에 Clement의 코드를 사용하여 이미지로드 속도가 훨씬 빠릅니다. –

관련 문제