2012-09-23 1 views
2

J'essaye d'écrire une routine qui va enregistrer un fichier Bitmap WPF en tant que fichier JPEG codé en utilisant LibTiff.net. En utilisant les exemples fournis avec LibTIFF je suis venu avec ce qui suit:Enregistrement de BitmapSource en tant que fichier JPEG encodé en Tiff en utilisant Libtiff.net

private void SaveJpegTiff(BitmapSource source, string filename) 
    { 

     if (source.Format != PixelFormats.Rgb24) source = new FormatConvertedBitmap(source, PixelFormats.Rgb24, null, 0); 


     using (Tiff tiff = Tiff.Open(filename, "w")) 
     { 
      tiff.SetField(TiffTag.IMAGEWIDTH, source.PixelWidth); 
      tiff.SetField(TiffTag.IMAGELENGTH, source.PixelHeight); 
      tiff.SetField(TiffTag.COMPRESSION, Compression.JPEG); 
      tiff.SetField(TiffTag.PHOTOMETRIC, Photometric.RGB); 

      tiff.SetField(TiffTag.ROWSPERSTRIP, source.PixelHeight); 

      tiff.SetField(TiffTag.XRESOLUTION, source.DpiX); 
      tiff.SetField(TiffTag.YRESOLUTION, source.DpiY); 

      tiff.SetField(TiffTag.BITSPERSAMPLE, 8); 
      tiff.SetField(TiffTag.SAMPLESPERPIXEL, 3); 

      tiff.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); 

      int stride = source.PixelWidth * ((source.Format.BitsPerPixel + 7)/8); 

      byte[] pixels = new byte[source.PixelHeight * stride]; 
      source.CopyPixels(pixels, stride, 0); 

      for (int i = 0, offset = 0; i < source.PixelHeight; i++) 
      { 
       tiff.WriteScanline(pixels, offset, i, 0); 
       offset += stride; 
      } 
     } 

     MessageBox.Show("Finished"); 
    } 

Ceci convertit l'image et je peux voir une image JPEG mais les couleurs sont foiré. Je suppose qu'il me manque un tag ou deux pour le TIFF ou quelque chose ne va pas comme l'interprétation photométrique mais je ne suis pas tout à fait clair sur ce qui est nécessaire.

Cheers,

Répondre

0

Il est pas clair que voulez-vous dire en disant « les couleurs sont foiré », mais probablement vous devez convertir des échantillons de BGR BitmapSource à ceux attendus par RVB LibTiff.Net. Je veux dire, assurez-vous que l'ordre des canaux de couleur est RVB (le plus probable, ce n'est pas le cas) avant d'appliquer les pixels à la méthode WriteScanline.

+2

La couleur foirée est un peu difficile à décrire mais en utilisant une de mes images de test qui était principalement blanche, grise et rouge. Le blanc devient magenta, le vert gris et le vert rouge vif. Changer RGB en BGR n'a fait aucune différence. Assez bizarrement, si je l'enregistre comme LZW alors le tiff et les couleurs sont bien. Ce problème se produit lorsque je change la compression en JPEG. Edit: Cela m'a fait penser à quelque chose que j'ai lu dans la note d'application JPEG TIFF. L'interprétation photométrique est fausse - pour JPEG il devrait être YCBCR. J'ai changé cela et tout fonctionne maintenant. Merci, – making

Questions connexes