无损灰度JPEG"颜色"反转?

时间:2016-01-05 20:26:05

标签: colors jpeg libjpeg

Imagemagick可以反转JPEG的颜色,如下所示:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class PdfReaderPage
{        
    public int Foo;
}

[ClassInterface(ClassInterfaceType.AutoDual)]
public class AccessibleFromVBA
{
    public Microsoft.VisualBasic.Collection PdfReaderPages()
    {
        /* 1. make a List of PdfReaderPage elements */
        var csharp_list = new List<PdfReaderPage>()
        { 
            new PdfReaderPage() {Foo=1},
            new PdfReaderPage() {Foo=2},
            new PdfReaderPage() {Foo=3}
        };
        /* 2. convert it into a vb collection */
        var vb_coll = new Microsoft.VisualBasic.Collection();
        csharp_list.ForEach(x => vb_coll.Add(x));
        /* 3. deliver it */
        return vb_coll;
    }
}

但是,这不是无损的。我的直觉说颜色反转应该以无损方式进行,至少对于灰度图像,但我对JPEG几乎一无所知。因此我的问题是:

  • 理论上可以实现无损JPEG灰度反转吗?
  • 如果是这样,libjpeg或任何其他软件能够做到吗?

2 个答案:

答案 0 :(得分:1)

它不是无损的,因为JPEG中使用的RGB和YCbCr色彩空间的色域之间没有1:1的匹配。如果你从YCbCR内的RGB值开始并翻转它,你可能得到一个超出YCbCr颜色空间范围的值,最终会被钳制。

答案 1 :(得分:1)

JPEG将图像编码为跨MCU的一系列熵编码增量(最小编码单位 - 8x8块DCT值)和每个MCU内的熵编码量化DCT系数。做像反转像素值(即使是灰度)这样的事情将涉及解码熵编码比特,修改值并重新编码它们,因为你不能反转&#34;熵编码的DCT值。对于每个值,不存在熵编码长度的一对一匹配,因为比特是基于统计概率和量化值的幅度/符号来编码的。另一个问题是编码的DCT值存在于频域中。我不是数学家,所以我无法确定是否有一种简单的方法来反转频域中的空间域值,但我认为它充其量是非常复杂和可能的值的量化将干扰简单的解决方案。你可以在JPEG文件中无损地做的事情是旋转,裁剪和鲜为人知的操作,例如从彩色图像中提取灰度图像。无需解码和重新编码导致“损失”的MCU,无法修改单个像素值。在JPEG质量。