Как использовать Bit Miracle LibTiff.Net для записи изображения в MemoryStream - PullRequest
2 голосов
/ 01 сентября 2011

Я получил изображение, сжатое с использованием CCITTFaxDecode .Поэтому я использовал LibTiff.Net из Bit Miracle, чтобы иметь возможность конвертировать изображение в любой формат.

Мне нужно записать распакованное изображение в 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 Ответ

1 голос
/ 08 декабря 2011

Проблема в следующем:

Tiff объект закрывается и удаляет поток после вызова метода Close.

Итак, вам, вероятно, следует изменить

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

на

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

, если вам понадобится использовать данные позже.

Другой подход - НЕ вызывать Tiff.Close, пока вы не закончили с потоком памяти.у этого подхода есть некоторые недостатки.

...