我正在使用jpeg编码器库(Jpegant)将原始YCbCr图像压缩到C中的Jpeg。该库适用于具有单独Y Cb和Cr分量的YCbCr图像。同样在库中,Y,Cb和Cr流分别编码,生成的字节在标题之后写入Jpeg文件。
现在我想使用相同的库仅将Y流编码为灰度Jpeg图像。 我做的第一步是删除Cb和Cr编码。因此只有Y流被编码并写入文件。 生成的文件不是灰度图像,只是垃圾。
我尝试通过在Cb和Cr中发送一个零流来做同样的事情,这给了我想要的东西,所以我认为问题不在于编码而在标题中。我正在使用的标题在此处描述https://github.com/t27/vt-fox-1/tree/master/STM32L1_Code/encoder#basic-output-file
我已在SOF和SOS部分中修改了流的数量(在上述文件中注释为' nrofcomponents')。我还从SOF,SOS和DHT部分删除了相关的Chrominance表/数据。我将Y子采样设置为0x11。每个部分的长度也会被修改。我也使用了jpegsnoop,甚至没有错误。
唯一的问题是,大多数jpeg观众都说我的文件无效且无法显示。
我还应该在标题中更改什么?
PS:我正在创建一个16 * 8(w * h)像素阵列并一次编码2个8 * 8的矩阵,我已将RSI设置为Imagewidth / 16.
答案 0 :(得分:3)
我找到了解决这个问题的方法。 基本上,标题具有用于彩色jpeg中的色度和亮度的量化表和霍夫曼表。 此外,数据流(Y,Cb,Cr)的数量在标题本身中定义。 所以我所做的是将流的数量更改为1,并从标头中删除不必要的量化和霍夫曼表。 重要的是重启间隔。当使用仅Y流时,我必须将重启间隔(在标题中)设置为YUV422格式的YCbCr流的RSI的两倍。
jpec库(仅编码灰度,与jpegants颜色编码相比)非常有用。 https://github.com/Moodstocks/jpec/blob/master/src/enc.c
答案 1 :(得分:0)
如果您有YCbCr JPEG并希望将其转换为灰度,您应该能够编写一个简单的过滤器。这样的过滤器几乎必须删除任何SOS流(扫描开始),扫描ID不是1.您还应该修改SOF帧市场,将组件数设置为1.
那将是最低限度的。您还可以删除扫描1未引用的任何DHT和DQT标记。
它不是很多。
如果您使用渐进式JPEG,可能会很有趣。上述过程对两者都有效,但其他人可能不会。