无法在 Libtiff.net 中使用 YCBCR 光度法写入图块

Failing to write tiles with YCBCR photometric in Libtiff.net

我正在使用 Libtiff.net 将平铺图像写入 tiff 文件。如果 Photometric 设置为 RBG,它工作正常,但如果我使用 YCbCr(为了减小文件大小),我会收到错误 "Application trasferred too few scanlines"。相关代码:

    private static Tiff CreateTiff()
    {
        var t = Tiff.Open(@"d:\test.tif", "w");
        const long TIFF_SIZE = 256;  
        t.SetField(TiffTag.IMAGEWIDTH, TIFF_SIZE);
        t.SetField(TiffTag.IMAGELENGTH, TIFF_SIZE);

        t.SetField(TiffTag.TILEWIDTH, TIFF_SIZE);
        t.SetField(TiffTag.TILELENGTH, TIFF_SIZE);

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

        t.SetField(TiffTag.COMPRESSION,  Compression.JPEG );
        t.SetField(TiffTag.JPEGQUALITY, 80L);

        t.SetField(TiffTag.PHOTOMETRIC, Photometric.YCBCR);

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

        return t;
    }
    private static void Go()
    {
        var tif = CreateTiff(true);
        var bmp = Image.FromFile(@"d:\tile.bmp") as Bitmap;
        var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
        var size = bmp.Width;
        var bands = 3;
        var bytes = new byte[size * size * bands];
        var bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

        try
        {
                System.Runtime.InteropServices.Marshal.Copy(bmpdata.Scan0, bytes, 0, bytes.Length);
        }
        finally
        {
            bmp.UnlockBits(bmpdata);
            bmp.Dispose();
        }
        tif.WriteEncodedTile(0, bytes, bytes.Length);

        tif.Dispose();

        Console.ReadLine();
    }

如果我使用 Photometric.RGB,同样的代码也有效。即使我使用 Photometric.YCbCr 编写剥离图像 (t.SetField(TiffTag.ROWSPERSTRIP, ROWS_PER_STRIP), tif.WriteEncodedStrip(count, bytes, bytes.Length))一切正常。

为什么我不能对平铺图像使用 YCbCr?提前致谢。

我终于找到了解决方法。我可以将 tiff 设置为 RGB,将像素数据编码为 YCbCr,然后写入。输出图像的大小大大减小,如我所愿,然后我可以在读取图块时恢复 RGB 值。但这仍然不是一个完美的解决方案:任何其他软件都会将此 tiff 识别为 RBG,因此颜色不正确。

我想在写入数据后编辑光度标记,但我尝试过的每个软件要么忽略该命令,要么损坏文件。如何在不损坏图像的情况下修改此标签?