即使质量为100,libjpeg也不是精确的像素值

时间:2015-02-13 08:56:08

标签: colors jpeg rgb grayscale libjpeg-turbo

我正在编写一个程序来读取一些文本文件并使用libjpeg将其写入JPEG文件。当我将质量设置为100(使用jpeg_set_quality)时,灰度实际上没有质量下降。但是,当我转向RGB时,即使质量为100,也似乎有压缩。

当我将此输入转换为灰度JPEG图像时,它可以很好地工作并为我提供干净的JPEG图像:

0  0  0 0 0
0  0  0 0 0
0  0  0 0 0
0 255 0 0 0
255 0 0 0 0

(水平翻转)输出为:

grayscale

现在,当我假设该数组为红色时,分别使用以下两个数组作为绿色和蓝色:

0 0  0  0 0
0 0  0  0 0
0 0 255 0 0
0 0  0  0 0
0 0  0  0 0


0 0 0  0 255
0 0 0 255 0
0 0 0  0  0
0 0 0  0  0
0 0 0  0  0

这是我得到的颜色输出:

RGB

虽然只有5个输入像素具有任何颜色值,但是在转换为颜色时,周围像素也获得了一个值。对于灰度图像和RGB图像,质量设置为100.

我想知道造成这种情况的原因以及我如何修复它,以便颜色也只用于实际具有输入值的像素?

2 个答案:

答案 0 :(得分:1)

您从RGB-> YCbCr转换中收到错误。这是不可避免的,因为在两个颜色空间之间没有1:1的映射。

答案 1 :(得分:0)

修复很简单 - 只是不要使用jpeg。 Png是您用例的更好选择。

你所看到的是jpeg压缩如何工作的结果,有“无损jpeg”这样的东西,但它实际上是一个完全不同的文件格式,并没有得到很好的支持。