使用Libtiff.net将BitmapSource保存为Tiff编码的JPEG

时间:2012-09-23 23:22:31

标签: wpf jpeg bitmapsource libtiff.net

我正在尝试编写一个例程,它将使用LibTiff.net将WPF BitmapSource保存为JPEG编码的TIFF。使用LibTiff提供的示例,我想出了以下内容:

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解释那样出了问题,但我并不完全清楚需要什么。

干杯,

1 个答案:

答案 0 :(得分:0)

通过说&#34;你不明白是什么意思颜色搞砸了#34;但可能你应该将BitmapSource的BGR样本转换为LibTiff.Net预期的RGB样本。

我的意思是,在将像素投放到WriteScanline方法之前,请确保颜色通道的顺序是RGB(很可能,它不是)。