Есть ли умный способ сжать изображения до максимального размера файла вместо уровня качества?

Google App Engine недоволен файлами изображений размером более 1 М. http://code.google.com/appengine/docs/python/images/overview.html#Quotas_and_Limits

Учитывая произвольное изображение, предоставленное пользователем, и возможность запускать код C для его предварительной обработки, есть ли какой-нибудь умный способ сократить до 1M с максимальным качеством?

Путь грубой силы состоит в том, чтобы найти уровень сжатия и разрешение, которые приводят к файлу ‹1M, попробовав ряд настроек качества JPEG и ряд коэффициентов масштабирования.

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

Какие могут быть хорошие эвристики, может быть, предположения о процентном сжатии, достигаемом при различных уровнях качества JPEG?

Грубая сила обладает достоинством простоты и, вероятно, в любом случае будет достаточно быстрой, но просто любопытно.


person Havoc P    schedule 01.11.2010    source источник
comment
Чтобы уточнить, я пытаюсь спросить здесь об особенностях JPEG, а не об общих методах поиска, таких как двоичный поиск. Это все еще грубая сила в том смысле, в каком я имел в виду.   -  person Havoc P    schedule 01.11.2010


Ответы (4)


стандартный бинарный поиск предполагает случайные данные, что здесь, конечно, не так. Более эффективным подходом является линейная интерполяция. Эта функция Size of Compressed Image (Размер несжатого изображения), как и любая разумная функция, является линейной с заданным достаточно малым интервалом. Итак, при каждом взаимодействии предположим линейный отклик. Это даст ответ НАМНОГО быстрее, чем бинарный поиск. НАПРИМЕР. сжато с качеством 50%, 0,75 M, поэтому используйте (1/0,75) * 50% ~ 62%. Допустим, это приводит к изображению размером 1,5 М. Теперь у нас есть две точки. (Х = 50%, Y = 0,75 М) и (Х = 62%, Y = 1,5 М). Наклон равен (1,5-0,75)/(62-50)=0,75/12. Таким образом, наше второе предположение будет 0,25M X (12/0,75)=4%, 50%+4%=54%. догадки до сих пор, и повторяйте процесс, пока результат не сделает вас счастливым. Вы можете использовать интерполяцию более высокого порядка, такую ​​как метод Ньютона, который, вероятно, сойдется еще быстрее.

person Steven Pace    schedule 12.11.2010

Алгоритм простой — создавайте jpeg с качеством 100, если меньше 1М, используйте его, если больше, создавайте с 50, если сейчас меньше 1М, то пробуйте 75, иначе пробуйте 25…

person tig    schedule 01.11.2010
comment
правильно, я полагаю, что бинарный поиск включался в поиск методом грубой силы - person Havoc P; 01.11.2010
comment
Это называется алгоритмом бинарного поиска. en.wikipedia.org/wiki/Binary_search_algorithm - person Malfist; 01.11.2010

Уважаемая команда Google AppEngine!

Пожалуйста, снимите ограничение в 1 МБ для файлов изображений. Уже существуют квоты и цены, связанные с хранением, обработкой, пропускной способностью и т. д., чтобы стимулировать разработчиков к уменьшению размеров файлов.

Спасибо за все.
С уважением,

Сообщество разработчиков

person vonkohorn    schedule 02.11.2010

Эта статья самого Джеффа Этвуда, кажется, подразумевает, что есть способ «стандартизировать коэффициент сжатия JPEG, равный 15»: Сравнение уровней сжатия JPEG и повторного сжатия (я не полностью прочитал статью, поэтому мог неправильно понять сообщение, когда Я посмотрел на него).

Если вы можете установить коэффициент сжатия, вы можете установить желаемый размер.

Таблица в статье в Википедии выглядит интересно. Качество = 50 -> Коэффициент сжатия = 15:1 (доказано эмпирическим измерением в Википедии :-) ... Я откладываю, я должен сейчас заняться чем-то другим...)

person bjoernz    schedule 01.11.2010
comment
Это хороший способ получить приблизительный начальный уровень сжатия, а затем вы можете продолжить использовать алгоритм двоичного поиска, упомянутый в других ответах отсюда. Выберите соответствующие максимальные размеры, а также. - person Blair McMillan; 01.11.2010
comment
Коэффициент сжатия, заданный механизму JPEG, не определяет результирующий размер. Два изображения, начиная с одинаковых размеров, могут быть сжаты до файлов совершенно разных размеров при одном и том же уровне сжатия. Таблица в Википедии действительна только для этого образца изображения и ни для каких других. - person Mark Ransom; 01.11.2010