如何使用DotNetZip ZipEntry類在WPF中加載圖像。從DotNetZip條目加載圖像
using (ZipFile file = ZipFile.Read ("Images.zip"))
{
ZipEntry entry = file["Image.png"];
uiImage.Source = ??
}
如何使用DotNetZip ZipEntry類在WPF中加載圖像。從DotNetZip條目加載圖像
using (ZipFile file = ZipFile.Read ("Images.zip"))
{
ZipEntry entry = file["Image.png"];
uiImage.Source = ??
}
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;
}
你可能會使用一個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;
什麼的UIImage?什麼類型的? – Cheeso
它的類型圖像。 – Dave