Потоковый Jpeg Resizer - PullRequest
       24

Потоковый Jpeg Resizer

1 голос
/ 16 сентября 2009

Кто-нибудь знает какой-либо код, который выполняет потоковое изменение размеров Jpeg. Под этим я подразумеваю чтение фрагмента изображения (в зависимости от исходного источника и размера назначения это, очевидно, будет меняться) и изменение его размера, что позволяет снизить потребление памяти при изменении размера очень больших jpegs. Очевидно, что это не сработает для прогрессивных jpegs (или, по крайней мере, станет намного сложнее), но это должно быть возможно для стандартных jpegs.

Ответы [ 2 ]

2 голосов
/ 17 сентября 2009

Я не знаю библиотеки, которая могла бы сделать это с полки, но это, безусловно, возможно.

Допустим, ваш JPEG использует микроконтроллеры 8x8 пикселей (единицы, в которых сгруппированы пиксели). Также допустим, что вы уменьшаете коэффициент до 12 к 1. Первый выходной пиксель должен быть средним для блока пикселей 12x12 в левом верхнем углу входного изображения. Чтобы получить входные пиксели с координатой y, превышающей 8, необходимо декодировать начало второго ряда MCU. Вы не можете реально декодировать эти пиксели перед декодированием всего первого ряда MCU. На практике это, вероятно, означает, что вам нужно хранить две строки декодированных блоков MCU. Тем не менее, для изображения размером 12000x12000 пикселей (примерно 150 мегапикселей) вы бы сократили требования к памяти в 12000/16 = 750 раз. Этого должно быть достаточно для ПК. Если вы рассматриваете использование встраиваемых систем, вы можете изменять размеры строк MCU по горизонтали по мере их чтения, снижая требования к памяти еще в 12 раз, за ​​счет немного большей сложности кода.

Я бы нашел простую библиотеку jpeg-декодера, такую ​​как Tiny Jpeg Decoder , и посмотрел бы на основной цикл в функции jpeg decode. В случае Tiny Jpeg Decoder основной цикл вызывает decode_MCU, оттуда изменить. : -)

У вас есть куча непростой работы, чтобы заставить код работать для не 8x8 MCU и увеличить нагрузку, если вы хотите уменьшить не на целое число. Звучит как весело, хотя. Удачи.

2 голосов
/ 17 сентября 2009

Дизайн данных JPEG позволяет легко изменять размер до 1/2, 1/4 или 1/8. Возможны и другие варианты. Такое же уменьшение размера легко сделать и в прогрессивном формате JPEG, и количество данных для анализа в прогрессивном файле будет намного меньше, если вы хотите уменьшить размер изображения. Кроме того, ваш вопрос недостаточно конкретен, чтобы знать, что вы действительно хотите сделать.

Еще один простой способ уменьшить размер данных на 33% - визуализировать изображение в растровое изображение RGB565 вместо RGB24 (если вам не требуется полное цветовое пространство).

...