2016-01-11 3 views
2

У меня есть несколько библиотек javascript (angular-ahdin, J-I-C), которые я могу использовать для сжатия изображения, загруженного пользователем, прежде чем я отправлю его на задний план.Алгоритм сжатия jpeg для достижения заданного размера целевого изображения

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

Моя идея - использовать алгоритм типа «двоичный поиск», чтобы попробовать разные качественные проценты, пока я наконец не получу изображение, которое находится под максимальным размером файла цели.

Он начнется с 50% качества jpeg. Если сжатое изображение находится под размером целевого файла, то переходите к качеству 75%, иначе переходите к качеству 25% и так далее. Это достигло целевого размера файла до степени детализации 1% в течение 6 итераций, и я бы остановился.

Предполагая, что нет библиотеки, которая уже имеет эту функцию, есть ли лучший способ, чем бинарный поиск? Есть ли какие-либо исследования изображений, которые показывают лучшее значение семени, чем 50%?

ответ

3

Двоичный поиск может быть достаточно хорошим для вашей проблемы, но подразумевается, что сжатый размер файла является линейной функцией параметра Q, что, вероятно, не так. Следовательно, могут быть более эффективные варианты.

Если у вас есть репрезентативная выборка изображений, с которыми вы будете иметь дело, вы можете рассчитать среднюю функцию размера как функции функции Q. Затем вы можете узнать, какой будет оптимальная отправная точка, и как быстро размер изменится при изменении Q.

В любом случае таблицы квантования JPEG обычно рассчитываются как «масштабированная» версия стандартного IJG Таблица. Записи таблицы T [я], как правило, масштабируется в зависимости от Q, как

S = Q < 50 ? 5000/Q : 200 - 2Q 
T_Q[i] = (S*T[i] + 50)/100 

Таким образом, если ваша библиотека следует такой подход, это может иметь смысл использовать бинарную (линейный) поиск Q> = 50 и адаптировать линейный поиск для Q < 50 корпусов.

Наконец, если вы можете использовать алгоритм прогрессивного сжатия, такой как JPEG2000, вы бы прямо избегали этой проблемы, поскольку целевой параметр битрейта (эквивалент, сжатый размер файла) можно использовать в качестве параметра.

+0

Дайте мне обзор, особенно. JPEG2000 – toddmo

2

В связи с тем, что алгоритм JPEG работает, ваш подход «двоичного поиска» является единственным жизнеспособным подходом, если размер вывода действительно является критическим. JPEG просто не был разработан с этой целью и использует настройку качества для удаления информации, а не для расчета по конкретной цели.

Поскольку степень сжатия будет варьироваться WILDLY В зависимости от содержания и сложности изображения также не лучше, чем на 50%, вам нужно проанализировать изображение, чтобы лучше понять, а затем вы может просто сжать его.

Единственное возможное улучшение, которое я вижу в двоичном поиске, - сделать его распределенным поиском. Таким образом, если 50% дает 40 КБ, а 75% дает 80 КБ, а у вас меньше 50 КБ, это довольно безопасная ставка, чтобы попробовать (50% + пол (25 * 1/4)) = 56% вместо 62,5%. Поскольку коэффициент сжатия JPEG не является линейной функцией настройки качества, я сомневаюсь, что это будет намного более эффективным в реальных сценариях.

+0

Итак, вы думаете, что (50% + пол (25 * 1/4)) сохранил бы несколько итераций обычно? По крайней мере, это идея. – toddmo

+0

Это может быть. Мне так же интересно, как и в том, будет ли это более или менее эффективным, чем чистый двоичный подход. Однако вам нужно будет запустить более 100 тестовых примеров. –

+0

Хорошо, я дам немного больше времени, а затем отметьте как ответ, если мы не получим члена команды jpeg или что-то lol. Благодаря! – toddmo