2011-12-19 41 views
2

我正在解码jpeg文件。我已经生成了霍夫曼表和量化表,并且我已经到了必须解码DC和AC元素的地步。例如可以说我有一个数据从jpeg文件生成交流元素

FFDA 00 0C 03 01 00 02 11 03 11 00 3F 00 F2 A6 2A FD 54 C5 5F FFD9 

如果我们忽略SOS标志几个字节,我真正的数据是从F2字节开始。所以让我们以二进制(从F2字节开始)写:

1111 0010 1010 0110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111 
    F 2 A 6 2  A F D 5 4 C 5 5 F 

在解码时,第一要素是亮度DC元素让我们对其进行解码。

[1111 0]010 1010 0110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111 
    F 2 A 6 2  A F D 5 4 C 5 5 F 

因此11110是霍夫曼代码(在我的情况下)元素08。这意味着接下来的8位是我的DC值。当我取下8位时,值为:

1111 0[010 1010 0]110 0010 1010 1111 1101 0101 0100 1100 0101 0101 1111 
    F 2 A 6 2  A F D 5 4 C 5 5 F 

DC元件值为-171。

这是我的问题:接下来是亮度AC值,但是我不是真正了解AC时非零的情况下的标准吗? TNX!

+1

我可以推荐一个叫冲动的冒险网站,解释了JPEG – Jimmy 2011-12-20 14:55:33

+0

需要大量的解码我已经访问过并分析了推荐页面,但是当交流元素为零时有例子。 – MrD 2011-12-21 01:00:35

+0

你可以从上面的网站下载jpeg snoop源代码,这应该回答你有关于jpeg解码的任何其他问题 – Jimmy 2011-12-21 13:28:16

回答

4

正如您所见,DC值被定义为指定正或负DC值的“额外”位数。 AC系数的编码方式不同,因为它们中的大部分都是0.哈夫曼表为AC系数的每个条目定义了“跳过”值和“额外位”长度。跳过值是在存储该值之前跳过多少个AC系数,并且额外的位以与DC值相同的方式处理。对AC系数进行解码时,可以解码1到63的值,但MCU编码的结束方式可能会有所不同。您可以将实际值存储在索引63处,或者如果您的索引大于48,则可以获得ZRL(零运行长度= 16个零)或任何组合,这会将您带到最后。简化的解码循环:

void DecodeMCU(signed short *MCU) 
{ 
int index; 
unsigned short code, skip, extra; 

    MCU[0] = decodeDC(); 
    index = 1; 
    while (index < 64) 
    { 
     code = decodeAC(); 
     skip = code >> 4; // skip value 
     extra = code & 0xf; // extra bits 
     index += skip; 
     MCU[index++] = calcACValue(extra); 
    } 
} 

颜色分量可以交错(典型)或存储在单独的扫描中。元件在每个MCU中以Z字形顺序编码(首先是低频元件)。定义MCU的8×8系数块的数量取决于颜色子采样。对于1:1,将会有1个Y,然后是1个Cr和1个Cb。对于典型的数码相机图像,水平轴进行二次采样,所以您将得到2个Y块,然后是1个Cr和1个Cb。压缩图像的质量设置决定了所使用的量化表以及多少个零AC系数被编码。质量越低,每个MCU的零点就越多。当您在MCU上执行逆DCT时,零的数量将决定您的8x8,16x8,8x16或16x16像素块中保留了多少细节。下面是基本步骤:

1)熵解码的8×8系数的块,每个颜色分量被分开存储
2)去交错和去量化的系数
3)上的系数执行逆DCT(可能对于6个8×8块的4:2:0子采样)
4)转换从的YCrCb的色彩空间为RGB或任何你需要

+0

这帮了我很多。你说过“颜色分量可以交错(典型)或存储在单独的扫描中”。我如何从文件生成这些信息? – MrD 2011-12-23 16:33:16

+1

在SOF(帧开始)标题中,它指定了颜色分量的数量(对于普通彩色图像通常为3)。 SOS(扫描开始)标题告诉您扫描中有多少种颜色成分。如果它是3,则颜色交错,如果颜色较少,则颜色存储在单独的扫描中。 – BitBank 2011-12-23 17:32:23

+0

非常感谢你救了我。 – MrD 2011-12-23 19:22:53