【发布时间】:2012-02-02 15:39:20
【问题描述】:
按照 JPEG 标准,哈夫曼表是通过两个步骤从一组统计信息中生成的。其中一个步骤是实现这张图片给出的功能/方法:(这张图片在JPEG标准的附件K中给出):
问题就在这里。以前在标准(附件C)中说过这句话:
霍夫曼表以 16 字节列表 (BITS) 的形式指定,给出每个代码长度的代码数量 1 到 16。后面是 8 位符号值 (HUFFVAL) 的列表,每个符号值都分配有一个霍夫曼代码。
显然BITS 是 16 个元素的列表。但在上图中,i 首先设置为 32 (i=32) 然后我们要访问BITS[i]。可能是我误会了什么,请高人解答一下。
这是图片的JPEG标准描述: 图 K.3 给出了调整 BITS 列表以使代码不超过 16 位的过程。由于符号是成对的 对于最长的霍夫曼码,符号从这个长度类别中一次删除两个。对的前缀 (短一点)分配给一对中的一个;然后(跳过该前缀长度的 BITS 条目)一个代码字 从下一个最短的非零 BITS 条目开始,将其转换为两个码字长一位的前缀。 BITS之后 list 减少到最大码长 16 位,最后一步从码长中删除保留的码点 数。
这是上图的代码:
void adjustBitLengthTo16Bits(vector<char>&BITS){
int i=32,j=0;
while(1){
if(BITS[i]>0){
j=i-1;
j--;
while(BITS[j]<=0)
j--;
BITS[i]=BITS[i]-2;
BITS[i-1]=BITS[i-1]+1;
BITS[j+1]=BITS[j+1]+2;
BITS[j]=BITS[j]-1;
continue;
}
else{
i--;
if(i!=16)
continue;
while(BITS[i]==0)
i--;
BITS[i]--;
return;
}
}
}
【问题讨论】:
标签: encoding jpeg huffman-code