2011-09-01 44 views
2

我收到使用CCITTFaxDecode压缩的图像。所以我使用Bit Miracle的LibTiff.Net来将图像转换为任何格式。如何使用位奇迹LibTiff.Net将图像写入到一个MemoryStream

我需要将解压缩的图像写入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(); 

时遇到的问题是,MemoryStream字节数组是不是有效的图像。

我用System.Drawing.Image类加载这newStream内存流,但在字节数组中有一些空值。

如果我使用Open构造写入到磁盘它工作正常图像。

我想知道,如果有人知道为什么MemoryStream未能保存解压缩图像。

由于

回答

1

的问题是:

Tiff对象关闭,并且调用Close方法后处置流。

因此,如果您以后需要使用的数据,你可能要改变

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

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

另一种方法是不调用Tiff.Close,直到你与内存流来完成。但是这种方法有一些缺点。