Таблица Хаффмана в стандарте JPEG создается из набора статистических данных в два этапа.Одним из шагов является реализация функции / метода, заданного этим изображением: (Это изображение дано в Приложении K стандарта JPEG):
Проблема здесь.Ранее в стандарте (Приложение C) говорится это предложение:
Таблицы Хаффмана указаны в виде 16-байтового списка (БИТОВ), в котором указано количество кодов для каждой длины кода от 1 до 16. Этосопровождается списком 8-битных значений символов (HUFFVAL), каждому из которых назначается код Хаффмана.
Очевидно, BITS
- это список из 16 элементов.Но на картинке выше, i
сначала установлен на 32 (i=32
), затем мы хотим получить доступ к BITS[i]
.Возможно, я что-то неправильно понял, поэтому, пожалуйста, позвольте мне дать ответ.
Вот стандартное описание изображения в формате JPEG: На рисунке K.3 приведена процедура настройки списка BITS так,что ни один код не длиннее 16 бит.Поскольку символы соединяются для самого длинного кода Хаффмана, символы удаляются из этой категории длины по два за раз.Префикс для пары (которая на один бит короче) назначается одной из пары;затем (пропуская запись BITS для этой длины префикса) кодовое слово из следующей кратчайшей ненулевой записи BITS преобразуется в префикс для двух кодовых слов на один бит длиннее.После того, как список BITS уменьшен до максимальной длины кода 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;
}
}
}