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

Уменьшение размера файла очень больших изображений без изменения размеров изображения

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

EDIT: Похоже, что с ImageMagick это должно быть довольно легко. Из docs:

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

convert -colors 254 in.png out.png

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

Я знаю, что вы хотите сохранить размер пикселя, но можете ли вы уменьшить размер пикселя и отрегулировать DPI, сохраненный с изображением, чтобы сохранить размер дисплея? Это зависит от того, какой клиент вы будете использовать для просмотра изображений, но большинство должно это наблюдать. Если вы используете изображения в Интернете, вы можете просто установить размер пикселя тега <img>.

Ответ 8

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

Ответ 10

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

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

-Открыть терминал

-type: sudo apt-get install gimp-plugin-registry

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

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

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

- отрегулируйте уровень качества, чтобы увеличить/уменьшить размер файла.

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

Ответ 11

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

Ответ 12

Щелкните правой кнопкой мыши по изображению. Выберите open с краской. Нажмите на размер. Нажмите на пиксель и измените горизонтальное положение на 250 или 200.

Это единственное. Это самый быстрый способ для тех, кто использует Windows XP или Windows 7.