2012-09-23 79 views
2

我正在嘗試編寫一個例程,它將使用LibTiff.net將WPF BitmapSource保存爲JPEG編碼的TIFF。使用配備的libtiff的例子,我想出了以下內容:使用Libtiff.net將BitmapSource保存爲Tiff編碼的JPEG

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"); 
    } 

這將圖像轉換,我可以看到一個JPEG圖像,但顏色都搞砸。我猜測我錯過了一個或兩個TIFF標籤,或者像Photometric解釋那樣是錯誤的,但對於需要什麼卻沒有完全清楚。

乾杯,

回答

0

目前還不清楚你怎麼說「顏色是搞砸了」,但可能是你應該的BitmapSource BGR樣本轉換爲RGB那些由LibTiff.Net預期的意思。

我的意思是,確保在將像素送入WriteScanline方法之前,顏色通道的順序是RGB(最可能不是這樣)。

+2

被弄亂的顏色有點難以描述,但使用了我的一張主要是白色,灰色和紅色的測試圖像。白色變成洋紅色,灰綠色和紅色亮綠色。將RGB更改爲BGR沒有區別。 奇怪的是,如果我將它保存爲LZW,那麼tiff和顏色都很好。當我將壓縮更改爲JPEG時,會發生此問題。 編輯:這讓我思考我在JPEG TIFF應用筆記中讀到的東西。光度解釋是錯誤的 - 對於JPEG,它應該是YCBCR。我改變了這一切,現在都在工作。 謝謝, – making