Уменьшение размера файла очень больших изображений без изменения размеров изображения - PullRequest
32 голосов
/ 13 февраля 2010

Рассмотрим приложение, обрабатывающее загрузку потенциально очень больших файлов PNG.

Все загруженные файлы должны храниться на диске для последующего извлечения. Однако размер файлов PNG может достигать 30 МБ, но ограничение дискового пространства дает максимальный размер файла 1 МБ.

Проблема состоит в том, чтобы взять входной PNG-файл размером до 30 МБ и создать выходной PNG-файл размером менее 1 МБ.

Эта операция, очевидно, будет с потерями - и снижение качества изображения, цветов и т. Д. Не является проблемой. Тем не менее, одна вещь, которая не должна быть изменена, это размер изображения. Следовательно, входной файл измерения 800x600 должен создать выходной файл измерения 800x600.

Вышеуказанные требования являются строгими и не могут быть изменены.

Используя ImageMagick (или другой инструмент с открытым исходным кодом), как бы вы сократили размер входных PNG-файлов размером ~ 30 МБ максимум до 1 МБ на файл без изменения размеров изображения?

Ответы [ 12 ]

44 голосов
/ 13 февраля 2010

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

Очевидно, что в зависимости от изображения потеря качества изображения может быть существенной. JPEG лучше всего подходит для изображений «настоящей жизни», таких как изображения с камер. Это не так хорошо для логотипов, снимков экрана или других изображений с «резкими» переходами от светлого к темному. (PNG, с другой стороны, ведет себя противоположно - лучше всего подходит для логотипов и т. Д.)

Тем не менее, при разрешении 800x600, будет очень легко получить JPEG меньше 1 МБ. (Я был бы очень удивлен, увидев файл размером 30 МБ при этих небольших размерах.) На самом деле, даже несжатый , изображение будет только около 1,4 МБ:

800 pixels * 600 pixels * 3 Bytes / color = 1,440,000 Bytes = 1.4MB

Таким образом, вам нужно только коэффициент сжатия 1,4: 1, чтобы уменьшить изображение до 1 МБ. В зависимости от типа изображения сжатие PNG может очень хорошо обеспечить этот уровень сжатия. Если нет, то JPEG почти наверняка может - коэффициенты сжатия JPEG порядка 10: 1 не редкость. Опять же, качество / размер вывода будут зависеть от типа изображения.

Наконец, хотя я некоторое время не использовал ImageMagick, я почти уверен, что есть варианты повторного сжатия изображения с использованием определенного показателя качества. Прочитайте документы и начните экспериментировать!

РЕДАКТИРОВАТЬ: Похоже, это должно быть действительно легко с ImageMagick. Из документов :

$magick> convert input.png -quality 75 output.jpg

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

7 голосов
/ 13 февраля 2010

Ваш пример проблематичен, поскольку изображение размером 30 МБ с разрешением 800x600 хранит 500 бит на пиксель . Явно дико нереально. Пожалуйста, дайте нам реальные цифры.

Между тем, «дешевый и веселый» подход, который я бы попробовал, заключался бы в следующем: уменьшите изображение в 6 раз, затем увеличьте в 6 раз, а затем запустите сжатие PNG. Если вам повезет, вы уменьшите размер изображения в 36 раз. Если вам не повезет, экономия будет больше примерно 6.

pngtopng big.png | pnmscale -reduce 6 | pnmscale 6 | pnmtopng > big.png

Если этого недостаточно, вы можете бросить ppmquant в середине (на маленьком изображении), чтобы уменьшить количество цветов. (Примеры netpbm / pbmplus , которые я всегда находил более понятными, чем ImageMagick.)

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

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

4 голосов
/ 13 февраля 2010

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

И ~ 30 МБ до 1 МБ - это очень большое сокращение.

Было бы трудно достичь этого соотношения с переводом в монохромный режим.

3 голосов
/ 30 ноября 2012

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

convert -colors 254 in.png out.png
2 голосов
/ 12 ноября 2015

Вы можете попробовать утилиту pngquant. Это очень просто установить и использовать. И это может сильно сжать ваши PNG без видимой потери качества.

После установки попробуйте что-то вроде этого:

pngquant yourfile.png
pngquant --quality=0-70 yourfile.png

Для моего демонстрационного изображения (созданного imagemagick) первая команда уменьшает 350KB до 110KB, а вторая уменьшает его до 65KB.

1 голос
/ 20 февраля 2010
  • Шаг 1. Уменьшите изображение до 1/16 от исходного размера.
  • Шаг 2: Уменьшите количество цветов.
  • Шаг 3: Увеличьте размер изображения до его первоначального размера.
0 голосов
/ 26 октября 2017

Попробуйте ImageOptim https://imageoptim.com/mac это бесплатно и с открытым исходным кодом

0 голосов
/ 03 декабря 2015

Если вы хотите изменить размер изображения в Ubuntu, вы можете попробовать «gimp». Я пробовал несколько приложений для редактирования изображений в Ubuntu, и это, кажется, лучшее из них.

КАК УСТАНОВИТЬ?

-открытый терминал

-тип: sudo apt-get install gimp-plugin-registry

-дать пароль администратора. для этого вам нужно сетевое соединение.

-После установки откройте изображение в редакторе изображений GIMP. Затем перейдите: Файл> Экспортировать как> Нажмите кнопку «Экспорт»

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

-Настройка уровня качества для увеличения / уменьшения размера файла.

-После завершения настройки нажмите кнопку «Экспорт», чтобы сохранить файл.

0 голосов
/ 15 сентября 2015

использовать optipng уменьшить размер без потерь

http://optipng.sourceforge.net/

0 голосов
/ 20 июля 2014

Это зависит от типа изображения, от реальной фотографии или от компьютера, для реальных изображений png будет делать очень мало, он может даже не сжиматься вообще, используйте jpg для этих изображений, если изображение имеет ограниченное количество различных цветов (оно может иметь глубину изображения 24 бита, но число уникальных изображений low) png может сжиматься довольно красиво. png - это, в основном, реализация zip для изображений, поэтому, если много пикселей одинаковы, у вас может быть довольно хорошая степень сжатия, если вам нужно сжатие без потерь, не делайте изменения размера.

...