2

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 のタグが 1 つか 2 つ欠けているか、Photometric の解釈のような何かが間違っていると思いますが、何が必要か完全に明確ではありません。

乾杯、

4

1 に答える 1

0

「色が台無しになっている」と言って何を意味するのかは明確ではありませんが、おそらく BGR サンプルをBitmapSourceLibTiff.Net が期待する RGB サンプルに変換する必要があります。

WriteScanlineつまり、メソッドにピクセルを供給する前に、カラー チャネルの順序が RGB であることを確認してください (ほとんどの場合、そうではありません) 。

于 2012-09-24T16:40:32.197 に答える