2011-09-01 4 views
2

CCITTFaxDecode을 사용하여 압축 된 이미지를 받았습니다. 그래서 Bit Miracle의 LibTiff.Net을 사용하여 이미지를 어떤 형식 으로든 변환 할 수있었습니다.Bit Miracle LibTiff.Net을 사용하여 MemoryStream에 이미지를 쓰는 방법

압축 해제 된 이미지를 MemoryStream에 작성해야합니다. I는 다른 스레드로부터 코드 예를 사용하고 난 데있어 문제가 MemoryStream 바이트 배열 올바른 이미지이다 코드

using BitMiracle.LibTiff.Classic; 
... 

MemoryStream ms = new MemoryStream(); 
TiffStream stm = new TiffStream(); 

Tiff tiff = Tiff.ClientOpen("","w",ms,stm); 
tiff.SetField(TiffTag.IMAGEWIDTH, UInt32.Parse(pd.Get(PdfName.WIDTH).ToString())); 
tiff.SetField(TiffTag.IMAGELENGTH, UInt32.Parse(pd.Get(PdfName.HEIGHT).ToString())); 
tiff.SetField(TiffTag.COMPRESSION, Compression.CCITTFAX4); 
tiff.SetField(TiffTag.BITSPERSAMPLE, UInt32.Parse(pd.Get(PdfName.BITSPERCOMPONENT).ToString()));  
tiff.SetField(TiffTag.SAMPLESPERPIXEL, 1);  
tiff.WriteRawStrip(0, raw, raw.Length); 
MemoryStream newStream = (MemoryStream)tiff.Clientdata(); 

tiff.Close(); 

를 사용할 수 있었다.

newStream 메모리 스트림을로드하려면 System.Drawing.Image 클래스를 사용했지만 바이트 배열에 일부 null 값이 있습니다.

Open 생성자를 사용하여 디스크에 이미지를 쓰면 제대로 작동합니다.

누군가가 MemoryStream이 압축 해제 된 이미지를 저장하지 못하는 이유를 알고 있는지 알고 싶습니다.

감사

답변

1

문제는 다음과 같습니다

Tiff 객체가 닫히고 Close 방법 호출 후 스트림을 처분한다. 나중에 데이터를 사용해야하는 경우

그래서, 당신은 아마

MemoryStream newStream = new MemoryStream(ms.ToArray()); 

MemoryStream newStream = (MemoryStream)tiff.Clientdata(); 

을 변경해야합니다.

또 다른 방법은 메모리 스트림을 다 끝낼 때까지 Tiff.Close으로 전화하지 않는 것입니다. 그러나이 방법에는 몇 가지 단점이 있습니다.

관련 문제