2012-11-18 5 views
3

Так что я пытаюсь написать простую программу преобразования BMP в jpeg. Как вы знаете, в jpeg-сжатии, DCT, квантовании и энтропийном кодировании участвуют 3 основных этапа. Я хочу записать значения, вычисленные на каждой из этих промежуточных этапов, в файл.Каковы входные значения для DCT?

Теперь мой вопрос заключается в том, что после того, как я преобразовал значение RGB каждого пикселя в формат YUV и сохранил его в 3 отдельных двумерных массивах, DCT вычисляется на каждом из этих массивов? Таким образом, давая мне 3 разных массива с применением DCT? Если это так, то следующим шагом будет квантование каждого из массивов, соответствующих Y, U и V. Тогда энтропийное кодирование должно применяться к каждому из этих двухмерных массивов.

Как эти 3 массива объединены/записаны в файл, чтобы их можно было читать как .jpeg-файлы?

ответ

3

Прежде всего предлагаю вам скачать jpeg specifications.

Вам необходимо вычислить DCT отдельно для каждого цветового канала: так что для цветового пространства YUV вам нужно вычислить один DCT для каждого блока Y 8x8, один для U и один для V-канала.

В большинстве случаев каналы U и V являются субдискретизированными: это значит, что есть 2 или 4 Y блоки для каждого U и V.

После того, как DCT, было применено, то вы можете квантовать каждый ДКП: для разных каналов обычно требуются разные таблицы квантования (спецификации jpeg показывают правильные таблицы).

Результат квантования затем кодируется с использованием алгоритма Хаффмана: вы можете сбросить поток jpeg в каждом цветовом канале в чередовании (от одного до 4 блоков Y следуют 1 U и 1 V блок) или линейного режима (сначала все Y блоков, затем все U, а затем V).

В потоке jpeg могут содержаться метки RST, которые повторно синхронизируют декодирование в случае потери байтов.

Но вам действительно нужно иметь спецификации jpeg для выполнения этой задачи.