ImageMagick: масштабирование изображения PNG с максимальным размером файла

Как бы вы масштабировали / оптимизировали / минимально выводили изображение PNG, чтобы оно было меньше определенного максимального размера файла? (Источники ввода разные - PDF, JPEG, GIF, TIFF ...)

Я искал во многих местах, но не нашел ответа на этот вопрос.

В ImageMagick для вывода JPEG это можно сделать с помощью extent (см., Например, ImageMagick: масштабировать изображение JPEG до максимального размера файла), но, похоже, нет эквивалента для других форматов файлов, например PNG.

Я мог бы использовать Wand или PIL в цикле (предпочтение для python), пока размер файла не станет ниже определенного значения, но для 1000 изображений это будет иметь большие накладные расходы ввода-вывода, если нет способа предсказать / оценить размер файла без его записи вышел первым. Пожалуй, это единственный вариант.

Я также мог бы обернуть различные инструменты командной строки (macOS) в python.

Кроме того, я хочу выполнять сжатие только там, где это абсолютно необходимо (источник - в основном текст), что оставляет выбор алгоритмов сжатия.

Спасибо за помощь.

PS Другие актуальные вопросы:

Масштабировать изображение в соответствии с максимальным размером файла

Сжимайте изображение PNG с помощью ImageMagick

python устанавливает максимальный размер файла, когда преобразование (pdf) в jpeg с использованием, например, Жезл

Изменить: https://stackoverflow.com/a/40588202/1021819 тоже довольно близко - хотя точный код там уже (неизбежно?) делает некоторые выборы относительно того, как уменьшить размер файла (resize в этом случае). Возможно, нет универсального способа сделать это без многомерного поиска.

Кроме того, поскольку входные файлы представляют собой PDF-файлы, можно ли это сделать с помощью PIL? Первый выбор касается растеризации, для которой я использовал Wand.

https://stackoverflow.com/a/34618887/1021819 также полезен, поскольку он использует палочку, поэтому работа в цикле двоичного прерывания кажется шагом вперед.


person jtlz2    schedule 01.08.2017    source источник
comment
Возможный дубликат Python PIL: Определите размер изображения, не записывая его в файл   -  person Ofer Sadan    schedule 01.08.2017
comment
Вы можете довольно быстро увеличить нужный размер, выполнив двоичный поиск. Вам не нужно сохранять файл на диск, сохраните его в io.BytesIO(). Обратите внимание, что файлы PNG, создаваемые PIL, часто можно значительно уменьшить с помощью оптимизатора PNG, такого как optipng.   -  person PM 2Ring    schedule 01.08.2017
comment
Спасибо обоим - очень полезно - я хочу, если возможно, управлять всем с python (вместо того, чтобы вызывать из него исполняемые файлы)   -  person jtlz2    schedule 01.08.2017
comment
Достаточно справедливо, существует модуль Python, который выполняет оптимизацию файлов изображений, но он использует внешние программы для фактического выполнения оптимизаций, так что вы можете сделать это самостоятельно, вызвав optipng через subprocess.   -  person PM 2Ring    schedule 01.08.2017
comment
Цель несколько бессмысленна, потому что PNG без потерь, и вы не меняете внешний вид изображения на размер файла. Компромисс между скоростью сжатия и оптимизацией, а не внешним видом и оптимизацией. Вы можете использовать параметр IM -colors, чтобы уменьшить количество цветов, что повлияет на размер файла и внешний вид.   -  person Glenn Randers-Pehrson    schedule 01.08.2017
comment
@ GlennRanders-Pehrson Это вовсе не бессмысленно - определенные API, которые я использую, допускают только файлы меньше определенного размера и в определенных форматах, и работают лучше в зависимости от используемого формата. Скорость для меня не так важна.   -  person jtlz2    schedule 01.08.2017
comment
Если вы хотите изменить размер файла до меньшего размера, то у меня есть сценарий оболочки bash unix, который использует ImageMagick для итеративного изменения размера изображения до тех пор, пока размер файла не достигнет заданного размера. См. fmwconcepts.com/imagemagick/downsize/index.php   -  person fmw42    schedule 01.08.2017
comment
эпично - спасибо @ fmw42!   -  person jtlz2    schedule 02.08.2017
comment
Я имел в виду, что оптимизация под указанный размер бессмысленна. С PNG просто выберите минимально возможное сжатие, используя мое приложение pngcrush, optipng, zopflipng и т. Д., Не беспокоясь о компромиссе между размером и внешним видом. Если этого недостаточно, подумайте об уменьшении количества цветов с помощью pngquant (255 цветов - хорошая первая попытка, потому что это позволит использовать PNG с 8-битной палитрой, что значительно сэкономит по сравнению с PNG с RGB).   -  person Glenn Randers-Pehrson    schedule 02.08.2017


Ответы (1)


PNG не требует компромисса между методом сжатия и внешним видом, потому что PNG не содержит потерь. Просто выберите файл наименьшего размера, используя мое приложение «pngcrush», «optipng», «zopflipng» и т.п.

Если вам нужен файл меньшего размера, чем может создать любой из них, попробуйте уменьшить количество цветов до 255 или меньше, что позволит кодеку PNG создавать PNG с индексированными цветами (цветовой тип 3), который составляет около 1/3 размер файла RGB PNG. Для этого вы можете использовать параметр ImageMagick «-colors 255». Однако для этого я рекомендую приложение «pngquant»; в большинстве случаев он работает лучше, чем IM.

person Glenn Randers-Pehrson    schedule 02.08.2017