C# - 我可以使用Libtiff输出Tiff编码的JPEG(在YCbCr中)

时间:2013-10-07 07:59:55

标签: c# image tiff libtiff.net

您好我是Libtiff和图像处理的新手,当我尝试使用Bitmiracle的Libtiff.net时,我有一个问题。

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

但是,当我将光度计从RGB更改为YCbCr时,程序就不起作用:输出只有8个字节(输入大约为400kb)。当以TXT打开图像时,它显示:

“II *”

我使用的代码是:

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输出,如果还有其他方法,它也很酷。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

输出图像被定义为破碎。通常在发生某些致命错误时发生。在这种情况下,库应该将警告和错误输出到控制台中。

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

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

相关问题