Как бы вы масштабировали / оптимизировали / минимально выводили изображение PNG, чтобы оно было меньше определенного максимального размера файла? (Источники ввода разные - PDF, JPEG, GIF, TIFF ...)
Я искал во многих местах, но не нашел ответа на этот вопрос.
В ImageMagick для вывода JPEG это можно сделать с помощью extent
(см., Например, ImageMagick: масштабировать изображение JPEG до максимального размера файла), но, похоже, нет эквивалента для других форматов файлов, например PNG.
Я мог бы использовать Wand или PIL в цикле (предпочтение для python), пока размер файла не станет ниже определенного значения, но для 1000 изображений это будет иметь большие накладные расходы ввода-вывода, если нет способа предсказать / оценить размер файла без его записи вышел первым. Пожалуй, это единственный вариант.
Я также мог бы обернуть различные инструменты командной строки (macOS) в python.
Кроме того, я хочу выполнять сжатие только там, где это абсолютно необходимо (источник - в основном текст), что оставляет выбор алгоритмов сжатия.
Спасибо за помощь.
PS Другие актуальные вопросы:
Масштабировать изображение в соответствии с максимальным размером файла
Сжимайте изображение PNG с помощью ImageMagick
Изменить: https://stackoverflow.com/a/40588202/1021819 тоже довольно близко - хотя точный код там уже (неизбежно?) делает некоторые выборы относительно того, как уменьшить размер файла (resize
в этом случае). Возможно, нет универсального способа сделать это без многомерного поиска.
Кроме того, поскольку входные файлы представляют собой PDF-файлы, можно ли это сделать с помощью PIL? Первый выбор касается растеризации, для которой я использовал Wand.
https://stackoverflow.com/a/34618887/1021819 также полезен, поскольку он использует палочку, поэтому работа в цикле двоичного прерывания кажется шагом вперед.
io.BytesIO()
. Обратите внимание, что файлы PNG, создаваемые PIL, часто можно значительно уменьшить с помощью оптимизатора PNG, такого как optipng. - person PM 2Ring   schedule 01.08.2017optipng
черезsubprocess
. - person PM 2Ring   schedule 01.08.2017