2011-08-18 2 views
2

DotNetZip ZipEntry 클래스를 사용하여 WPF에서 이미지를로드하는 방법은 무엇입니까? 당신이 실제로 수행 방식으로 지퍼를 열면 즉석에서 압축 해제하는 경우DotNetZip 항목에서 이미지로드

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

입니까? 어떤 타입의? – Cheeso

+0

이미지 유형입니다. – Dave

답변

0

또는 ZipEntry 유형이 판독 스트림을 리턴하는 OpenReader() 메소드를 노출 다음 rawStride 값, 예로서 MSDN has the following sample을 얻기 위하여

. 이런 식으로 당신이 수도 일 :

// 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으로 읽을 수 있습니다. 이 같은

뭔가 :있는 UIImage 무엇

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을 사용할 수 있지만 원시 이미지 데이터는 여전히 압축 해제해야합니다 있도록하거나, 아니; 당신은 다음과 같은 것을 할 수 있어야한다고 것을 일단 있지만 : rawImage이 이미지의 바이트 것

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

배열의 형태로 파일. 다른 인수에는 DPI 및 픽셀 형식이 포함됩니다. 이제 DPI 및 픽셀 형식을 결정해야합니다.

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