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

libjpeg not exact pixel values even with quality of 100

我正在编写一个程序来读取一些文本文件并使用 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

(水平翻转)输出为:

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

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

这是我得到的颜色输出:

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

我想看看是什么原因造成的,以及如何修复它,以便颜色也仅用于实际具有输入值的像素?

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

您看到的是 jpeg 压缩的结果,有 "lossless jpeg" 之类的东西,但它实际上是一种完全不同的文件格式,没有得到很好的支持。

您在 RGB->YCbCr 转换中遇到错误。这在大范围内是无法避免的,因为两个颜色空间之间没有 1:1 映射。