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

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)


arrow_upward
3
arrow_downward

стандартный бинарный поиск предполагает случайные данные, что здесь, конечно, не так. Более эффективным подходом является линейная интерполяция. Эта функция 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

arrow_upward
3
arrow_downward

Алгоритм простой — создавайте 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

arrow_upward
3
arrow_downward

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

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

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

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

person vonkohorn    schedule 02.11.2010

arrow_upward
1
arrow_downward

Эта статья самого Джеффа Этвуда, кажется, подразумевает, что есть способ «стандартизировать коэффициент сжатия 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