2011-09-01 2 views
2

J'ai reçu une image compressée en utilisant CCITTFaxDecode. J'ai donc utilisé LibTiff.Net de Bit Miracle pour pouvoir convertir l'image dans n'importe quel format.Comment utiliser Bit Miracle LibTiff.Net pour écrire l'image dans un MemoryStream

Je dois écrire l'image décompressée à MemoryStream. J'ai utilisé un exemple de code d'un autre fil et j'ai pu utiliser ce code

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(); 

Le problème que je vais avoir est que le tableau MemoryStream octet n'est pas une image valide.

J'ai utilisé la classe System.Drawing.Image pour charger ce flux de mémoire newStream, mais il y a des valeurs nulles dans le tableau d'octets. Si j'utilise le constructeur Open pour écrire l'image sur le disque, cela fonctionne correctement.

Je voudrais savoir si quelqu'un sait pourquoi le MemoryStream ne parvient pas à stocker l'image décompressée.

Merci

Répondre

1

Le problème est:

objet Tiff ferme et dispose flux après appel à la méthode Close.

Donc, vous devriez probablement changer

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

à

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

si vous avez besoin d'utiliser des données plus tard.

Une autre approche consiste à ne pas appeler Tiff.Close jusqu'à ce que vous avez terminé avec le flux de mémoire. cette approche a quelques inconvénients, cependant.

Questions connexes