Подтвердить что ты не робот

Как сохранить изображение с определенным размером файла?

Я создаю систему PHP, в которой пользователи могут создать визуально сложный образ, который имеет окончательное требование 50 кБ или менее.

Пользователь может выбрать, чтобы текст был напечатан на одном из 37 изображений шаблонов, поэтому результат представляет собой одно плоское изображение.

Текст может быть любого цвета и одного из нескольких шрифтов. Это означает, что окончательное изображение может быть визуально сложным и непредсказуемым (за исключением размеров изображения).

Затем у меня есть требование иметь размер файла окончательного изображения не более 50 КБ (это внешнее требование и не может быть изменено).

Последнее требование (опять же, внешнее) - это формат изображения .jpeg,.png или .gif.

Я просмотрел документацию GraphicsMagick, но не могу найти нигде, где упоминается возможность установить размер файла и иметь сжатие автоматически рассчитывается.

Я рассматривал это программно с помощью тестового цикла compress- > save- > , однако я могу представить, что это будет достаточно интенсивным, поскольку я не могу заранее вычислить размер файла на основе сжатия. Вот почему я прошу выяснить, была ли проблема решена в GraphicsMagick.

Edit

Чтобы понять, почему существуют внешние требования:

Пользователь будет использовать эту систему для создания плоского изображения, которое они затем сохранят на своем ПК. Это изображение затем будет загружено в Adroll для использования в кампании Retargeting.

Вот Требования для добавления на изображение. Моя система будет предоставлять только размеры изображений 728x90, 300x250 и 120x600.

Изменить 27 ноября 2010

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

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


Как аналог, для тех, кто так склонен:

Я за то, что A * должен искать: он имеет определенную начальную/конечную точку и находит наилучший возможный маршрут в самое быстрое время.

То, что я надеялся избежать, - это то, что Breadth/Depth First для поиска: определенные начальные/конечные точки, но не может попасть на оптимальное решение после нахождения локального минимума и иметь возможность полностью выдувать вычислительно.

4b9b3361

Ответ 1

Поскольку невозможно сжать целевой размер, о котором я знаю, я предлагаю искать косвенное решение:

  • Сделайте некоторые быстрые статистические данные (возможно, сжав множество изображений с различными коэффициентами сжатия JPEG), чтобы узнать, что означает средний сжатый размер и его стандартное отклонение для заданного уровня качества.
  • При принятии изображения попытайтесь сжать подходящее качество. Если результирующий файл слишком большой, уменьшите качество и повторите попытку. При желании, если он окажется слишком маленьким, вы также можете увеличить качество.
  • Остановите, когда результирующее изображение "близко" к вашему целевому размеру, но меньше.

Чтобы немного вычислить математику на шаге 2:

Если вы выберете свое начальное качество таким образом, чтобы ваш средний расчетный размер + 3 * стандартное отклонение < вашего целевого размера, то 99,7% от сжатия приведут к созданию небольшого файла с первой попытки (при условии нормального распределения сжатых размеров).

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

Ответ 2

Посмотрите на следующий пакет:

http://www.phpclasses.org/package/3810-PHP-Optimize-images-to-fit-in-a-given-file-size-limit.html

Довольно круто - я бы сказал, что автор заслуживает пива;)

Пример изображения, которое на самом деле 61081 байт (первое изображение jpeg для отображения размера файла в изображении?):

alt text

Ответ 3

Можно ли использовать GraphicMagick -limit disk 50mb в коалиции с ресурсом "-list", чтобы вы могли проверить это на раннем этапе (или действительно опросить весь процесс) и внести коррективы?

http://www.graphicsmagick.org/GraphicsMagick.html#details-limit

Ответ 4

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

Что вы можете сделать, это собрать статистические данные (высота и ширина изображения и размер файла по сравнению с различными параметрами сжатия), а также ваши оценки на основе этих данных для новых изображений.

Пример:

  • 50k jpg, 100x200 сжато 30k
  • 100k jpg, 100x200 сжато 60k

- > , когда вы получаете изображение 100x202px с 59k, сжатый размер будет приблизительно оценен 35k.

Ответ 5

Итак, если я понимаю это правильно - вы создаете систему, которая позволяет пользователям писать текст на одном из изображений шаблонов, которые вы предоставляете. Если это правильно, почему вы сохраняете изображение вообще? Вы можете легко удалить ограничение размера 50 Кбит, сохранив сами пользовательские действия. Возможно, вы сможете сделать что-то вроде: сохранить текст (вместе со своими свойствами и местоположением) и шаблон, в котором он находится.

Ответ 6

Есть только три способа уменьшить конечный размер любого изображения:

  • уменьшить разрешение
  • уменьшить глубину цвета
  • уменьшить сложность изображения

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

Уменьшение сложности изображения - неприятный зверь. Вы можете попытаться уменьшить межпиксельный "шум", чтобы создать большие области того же цвета, которые очень сжимаются в изображениях GIF/PNG. Простой фильтр размытия мог бы выполнить это, но он также мог бы повредить разборчивость любой мелкой печати/текста внутри изображения. Для цели JPG вы можете попытаться снизить качество сжатия, но опять же, это может испортить изображения, если вы снижаете качество слишком низко. Если простые преобразования на стороне сервера не могут справиться с этим, изображение должно быть переделано художником, который его создал в первую очередь.

Единственный практический метод, который я могу рассмотреть, чтобы автоматизировать это, - это цикл сжимания-сохранения-теста, который вы упомянули. Учитывая, что окончательные изображения относительно малы, это не будет большой нагрузкой на сервер. Сохранение gif/png - легкая операция. Сжатие JPG требует большей мощности процессора, но опять же, с небольшими изображениями, у современного сервера не должно быть проблем с выполнением 10 или 20 тестовых изображений в течение секунды или двух.

Ответ 7

Несмотря на то, что программный вариант цикла до достижения целевого файлового формата является популярным, есть два способа: .jpeg:: p >


Существует запатентованный метод Kuo, Chun-ming, поэтому я не уверен в коммерческой жизнеспособности его использования:

Метод и электронное устройство для настройки степени сжатия jpeg-изображения

На основе этой формулы:

log(NSF) = (log(SF1 / SF2) / log(FileSize1 / FileSize2)) * log(Target / FileSize1) + log(SF1)

Где

SF1 is a first compression parameter
SF2 is a second compression parameter
FileSize1 is the size of the image compressed with SF1
FileSize2 is the size of the image compressed with SF2
Target is the target file size
NSF is the target compression parameter.

Не ясно, если SF1, SF2 и NSF находятся в диапазоне 0-1 или 0-100 и т.д., и если FileSize1, FileSize2 и Target находятся в байтах, KiloBytes и т.д. Экспериментируйте с правильной комбинацией здесь, чтобы узнать правильные единицы.


Второй метод исходит от Рики Д. Нгуена в Массачусетском технологическом институте:

Контроль скорости и распределения бит для перекодирования JPEG

Он предлагает изменить данные, которые используются для сжатия во время его возникновения. Эта опция может быть нецелесообразной для реализации, поскольку она требует модификаций самого самого кода сжатия.


Из обоих этих примеров , безусловно, возможно сохранить файл .jpeg с определенным размером целевого файла.

Ответ 8

Сначала попробуйте 24-бит .png. Если это подходит, это будет лучшее качество, и все готово. В качестве альтернативы вы можете протестировать некоторые типичные изображения, и если ни один из них не подходит, вы можете полностью исключить формат из рассмотрения.

Для .gif и .jpg вам нужно будет искать наилучшее соответствие; ни один из них не может быть предсказан с достаточной уверенностью, и ни один из алгоритмов не подходит для кодирования с постоянной скоростью передачи. Вы можете использовать бинарный поиск, чтобы найти наилучший вариант. Вы можете выбрать коэффициенты сжатия из предопределенного списка, чтобы ограничить количество тестовых компрессий, которые вам нужно выполнить; например, если ваш список коэффициентов сжатия .jpg равен 4, 6, 8, 12, 18, 27, 44, 66, вам нужно будет выполнить максимум 4 тестовых сжатия.

.gif и paletted.png достаточно похожи, что вы должны просто выбрать один и забыть о другом.

Трудно выбирать между .gif/.png и .jpg на основе результатов сжатия; артефакты, вводимые каждым процессом, совершенно разные. Опять же, вам может быть лучше всего сжать несколько тестовых изображений до вашего целевого размера и исключить один или другой формат на основе тестирования на глаз.

Ответ 9

Возможно, вы смотрите на проблему из-за неправильного угла. Выбрав PNG и минимизируя метаданные, хранящиеся на изображении, вы уменьшите размер файла. Это связано с тем, что PNG является структурой Bitmap. Пока GMagick не сохраняет текст в виде метаданных, он не будет влиять на размер файла. Только глубина цвета (которую вы также можете контролировать) повлияет на размер файла. Не чередование без фильтрации размера файла должно быть по существу таким же, как размер шаблона. Пока шаблоны меньше 50 КБ, вы должны быть в порядке.