2

DotNetZipZipEntryクラスを使用してWPFに画像を読み込むにはどうすればよいですか。

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

2 に答える 2

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;
}
于 2011-08-21T14:07:02.580 に答える
0

を使用する可能性がありますBitmapSourceが、生の画像データはまだ解凍する必要があります。実際にその場で解凍する方法でzipを開くかどうかはわかりません。しかし、それができたら、次のようなことができるはずです:

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

rawImage配列形式の画像ファイルのバイトはどこにありますか。その他の引数には、DPI とピクセル形式が含まれます。これらは、現在、または決定できるはずです。

rawStride値を取得するために、 MSDN には例として次のサンプルがあります。

PixelFormat pf = PixelFormats.Bgr32;
int rawStride = (width * pf.BitsPerPixel + 7) / 8;
于 2011-08-18T09:30:26.847 に答える