В примечании Cryx о сжатии JPEG категории описаны как «минимальный размер в битах, в котором мы можем сохранить это значение». Далее говорится, что значения, попадающие в определенные диапазоны, помещаются в категории. Я вставил сегмент ниже, но не всю таблицу.
Values Category Bits for the value
0 0 -
-1,1 1 0,1
-3,-2,2,3 2 00,01,10,11
-7,-6,-5,-4,4,5,6,7 3 000,001,010,011,100,101,110,111
Кодировщик / декодер JPEG, найденный здесь , выполняет кодирование категорий с помощью побитовой операции, которую я не понимаю, и я надеюсь, что кто-то сможет уточнить для меня. RLE из 0 выполняется в другом месте, но эта часть кода разбивает оставшиеся значения пикселей на категории, как указано в документе Cryx.
В приведенном ниже коде переменная code
представляет собой значение YUV-значения пикселя. В то время как l oop, если условия выполняются, i
уменьшается до тех пор, пока не будет достигнута правильная категория. Например, если значение пикселя равно 6.0, начиная с категории 15, i
уменьшается до достижения 3. Это делается с помощью поразрядной операции, которую я не понимаю. Может кто-нибудь уточнить, какое состояние сейчас проверяется l oop? В частности, !(absc & mask)
является логическим значением, но я не понимаю, как это помогает нам определить правильную категорию.
Причина последнего оператора if мне также не ясна. Спасибо
unsigned absc = abs(*code);
unsigned mask = (1 << 15);
int i = 15;
if (absc == 0) { *size = 0; return; }
while (i && !(absc & mask)) { mask >>= 1; i--; }
*size = i + 1;
if (*code < 0) *code = (1 << *size) - absc - 1;