如何使用Bit Miracle LibTiff.Net将图像写入MemoryStream

时间:2011-09-01 17:50:46

标签: tiff libtiff.net

我收到了使用 CCITTFaxDecode 压缩的图片。所以我使用Bit Miracle的LibTiff.Net将图像转换为任何格式。

我需要将解压缩的图像写入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 个答案:

答案 0 :(得分:1)

问题是:

Tiff对象在调用Close方法后关闭并处理流。

所以,你可能应该改变

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

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

如果您以后需要使用数据。

另一种方法是在完成内存流之前不要调用Tiff.Close。但这种方法有一些缺点。