2011-08-18 69 views
2

如何使用DotNetZip ZipEntry類在WPF中加載圖像。從DotNetZip條目加載圖像

using (ZipFile file = ZipFile.Read ("Images.zip")) 
{ 
    ZipEntry entry = file["Image.png"]; 
    uiImage.Source = ?? 
} 
+0

什麼的UIImage?什麼類型的? – Cheeso

+0

它的類型圖像。 – Dave

回答

0

ZipEntry的類型公開,它返回一個可讀流的OpenReader()方法。以這種方式,你這可能工作:

// I don't know how to initialize these things 
BitmapImage image = new BitmapImage(...?...); 
ZipEntry entry = file["Image.png"]; 
image.StreamSource = entry.OpenReader(); 

我不能肯定這會工作,因爲:

  • 我不知道的BitmapImage類或如何管理它,或者如何從一個流創建一個。我可能在那裏有錯誤的代碼。

  • ZipEntry.OpenReader()方法在內部設置並使用由ZipFile實例管理的文件指針,可讀流僅在ZipFile實例本身的有效期內有效。
    由ZipEntry.OpenReader()返回的流必須在其他條目對ZipEntry.OpenReader()的任何後續調用之前以及在ZipFile超出作用域之前讀取。如果您需要從zip文件中提取並讀取多個圖像(無特定順序),或者在完成ZipFile後需要閱讀,則需要解決該限制。爲此,可以調用OpenReader()並將每個特定條目的所有字節讀取到不同的MemoryStream中。

事情是這樣的:

using (ZipFile file = ZipFile.Read ("Images.zip"))   
    {   
     ZipEntry entry = file["Image.png"]; 
     uiImage.StreamSource = MemoryStreamForZipEntry(entry);   
    } 

.... 

private Stream MemoryStreamForZipEntry(ZipEntry entry) 
{ 
    var s = entry.OpenReader(); 
    var ms = new MemoryStream(entry.UncompressedSize); 
    int n; 
    var buffer = new byte[1024]; 
    while ((n= s.Read(buffer,0,buffer.Length)) > 0) 
     ms.Write(buffer,0,n); 
    ms.Seek(0, SeekOrigin.Begin); 
    return ms; 
} 
0

你可能會使用一個BitmapSource,但原始圖像數據將仍然需要進行解壓縮,我不知道如果打開的方式,你實際上做的拉鍊上飛解壓縮,這樣,或不;但一旦你有,你應該能夠做到像下面這樣:

BitmapSource bitmap = BitmapSource.Create(
    width, height, 96, 96, pf, null, rawImage, rawStride); 

rawImage將是圖像文件的字節數組中的形式。其他參數包括您現在應該能夠確定的DPI和像素格式。

爲了得到rawStride值,MSDN has the following sample作爲一個例子:

PixelFormat pf = PixelFormats.Bgr32; 
int rawStride = (width * pf.BitsPerPixel + 7)/8;