Сокращение размера файла очень большие изображения, не изменяя размеры изображения

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

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

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

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

Указанные выше требования, обрисованные в общих чертах выше, строги и не могут быть изменены.

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

33
задан Etienne Neveu 9 July 2016 в 10:42
поделиться

5 ответов

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.Из docs :

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

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

44
ответ дан 27 November 2019 в 18:23
поделиться

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

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

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

4
ответ дан 27 November 2019 в 18:23
поделиться

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

0
ответ дан 27 November 2019 в 18:23
поделиться

Ваш пример вызывает затруднения, потому что изображение размером 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 не подходит для вашего приложения?

7
ответ дан 27 November 2019 в 18:23
поделиться

Если код является процедурным, то обычный псевдокод, вероятно, прост (некоторые примеры есть у Википедии).

Объектно-ориентированный псевдокод может оказаться более сложным. Рассмотрим:

  • использование диаграмм классов UML для отображения классов/наследования
  • использование диаграмм последовательностей UML для отображения последовательности кода
-121--1421878-

Я считаю, что причина, по которой существуют разные цели, связана с размером скалярных типов. Я думаю, что это также влияет на способ обработки COM-объектов.

У меня есть ситуация, когда у меня есть сторонняя библиотека .NET, которая, если используется в 64-разрядном приложении, программа терпит неудачу при вызове библиотеки, поэтому я должен ограничиться только 32-разрядным режимом.

-121--1740775-
  • Шаг 1: Уменьшите изображение до 1/16 исходного размера.
  • Шаг 2: Уменьшение количества цветов.
  • Шаг 3: Увеличьте размер изображения до исходного размера.
1
ответ дан 27 November 2019 в 18:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: