【问题标题】:C# - Can I use Libtiff to output Tiff encoded JPEG (In YCbCr)C# - 我可以使用 Libtiff 输出 Tiff 编码的 JPEG(在 YCbCr 中)
【发布时间】:2013-10-07 07:59:55
【问题描述】:

您好,我对 Libtiff 和图像处理还很陌生,当我尝试使用来自 Bitmiracle 的 Libtiff.net 时,我有一个问题。

我有一些 OJPEG TIFF 图像,想将它们转换成现在的 JPEG TIFF。我通过将源转换为 BMP 然后另存为 TIFF 来实现这一点(压缩:JPEG;光度学:RGB),但是图像的大小非常大。所以我想如果我可以用 YCbCr 的光度计来压缩它们,这可以大大减小尺寸。

但是,当我将光度计从 RGB 更改为 YCbCr 时,程序就无法运行:输出只有 8 个字节(输入约为 400kb)。以TXT格式打开图片时,显示:

“二*”

我使用的代码是:

byte[] raster1 = getImageRasterBytes(inputbmp[0], PixelFormat.Format24bppRgb);
tif1.SetField(TiffTag.IMAGEWIDTH, inputbmp[0].Width);
tif1.SetField(TiffTag.IMAGELENGTH, inputbmp[0].Height);
tif1.SetField(TiffTag.COMPRESSION, Compression.JPEG);
tif1.SetField(TiffTag.PHOTOMETRIC, Photometric.YCBCR);
tif1.SetField(TiffTag.ROWSPERSTRIP, inputbmp[0].Height);
//tif1.SetField(TiffTag.JPEGQUALITY, confidence);
tif1.SetField(TiffTag.XRESOLUTION, 200);
tif1.SetField(TiffTag.YRESOLUTION, 200);
tif1.SetField(TiffTag.BITSPERSAMPLE,8);
tif1.SetField(TiffTag.SAMPLESPERPIXEL, 3);
int stride = raster1.Length / inputbmp[0].Height;
convertSamples(raster1, inputbmp[0].Width, inputbmp[0].Height);
for (int i = 0, offset = 0; i < inputbmp[0].Height; i++)
{
    tif1.WriteScanline(raster1, offset, i, 0);
    offset += stride;
}

我不太确定 WriteScanline 是否可以处理 YCbCr 输出,如果有其他方法,它也很酷。

感谢您的帮助!

【问题讨论】:

    标签: c# image tiff libtiff.net


    【解决方案1】:

    输出图像肯定损坏。它通常发生在发生一些致命错误时。在这种情况下,库应该将警告和错误输出到控制台。

    请调查警告和错误。他们可能会给你答案。

    根据经验,我认为您可能为 ROWSPERSTRIP 标记提供了不正确的值。该值应为 8 的倍数。

    【讨论】:

    • 感谢您的回复!我试过了,发现 ROWSPERSTRIP 确实出错了。而在我把它改成16之后,仍然存在一些问题:“压缩算法不支持随机访问”和“JPEGLib:应用程序传输的扫描线太少”。我相信这可能是由 WriteScanline 函数引起的(仅供参考:remotesensing.org/libtiff/man/TIFFWriteScanline.3tiff.html DIAGNOSTICS 标签)。那么有没有办法复制整个条带?至于 JPEG,ROWSPERSTRIP 不能为 1(必须是 16 的复用)。谢谢。
    • @Mike,您可以在缓冲区中累积 16 个(或任何 ROWSPERSTRIP 值)扫描线,然后使用 WriteEncodedStrip 方法一次写入所有扫描线。
    • 感谢您的帮助!我刚刚完成我的代码,使用整个条带保存图像,它可以工作。
    • 嗨,迈克,您介意分享一下您是如何编写该条以保存图像的吗?
    • 我找到了,所以我把它放在这里(适应你的代码)以防其他人需要它:替换:int stride = raster1.Length / inputbmp[0].Height; convertSamples(raster1, inputbmp[0].Width, inputbmp[0].Height); for (int i = 0, offset = 0; i
    【解决方案2】:

    JPEG 已经在内部将图像转换为 YCbCr,所以我认为您不会从中受益。

    【讨论】:

    • 也许我是这个领域的新手,不确定,使用JPEG压缩数据的TIFF也可以在RGB颜色空间上工作,颜色转换为YCbCr可以大大压缩图像。实际上,当我在 RGB PHOTOMETRIC 下运行程序时,图像的大小大大增加(与原始 tiff 相比,即使用 YCbCr 的 OJPEG)。问题是当我尝试使用 YCbCr 时,无法生成图像。仅供参考:ftp.remotesensing.org/pub/libtiff/doc/TIFF6.pdf 第 102 页
    • 嗯,可能是 TIFF 在压缩为 JPEG 时不一定会转换为 YCbCr。但是,JPEG (JFIF) 本身总是使用 YCbCr。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多