Как узнать уровень сжатия PNG-файла и является ли он потерянным?

1942
TecMan

Могу ли я узнать, был ли сжат файл PNG и как (по крайней мере, было ли это сжатие без потерь) в Windows? Когда я открываю стандартное диалоговое окно свойств файла из проводника Windows, я не вижу никаких свойств, касающихся этого.

3

2 ответа на вопрос

8
Agent_L

PNG всегда сжимается алгоритмом DEFLATE, как указано в спецификации PNG. Это тот же алгоритм, который используется Zip-компрессором.

Для PNG нет алгоритмов сжатия с потерями. PNG всегда без потерь.

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

Многие приложения для редактирования изображений позволяют вам указать некоторые дополнительные параметры при сохранении вашей работы в формате PNG. Например, в paint.net мы видим опцию «Уровень дизеринга». Что касается сжатия ZIP, мы также можем указать уровень сжатия, используя такие архиваторы, как 7-Zip. Что об этом? Есть ли способ прочитать эту информацию из заголовка PNG, если это вообще возможно? TecMan 8 лет назад 0
@TecMan «Уровень дизеринга» - это опция уменьшения изображения до 8-битного цвета без сохранения PNG. Обратите внимание, что это то же самое для каждого 8-битного сохранения, а не только для PNG. Это совершенно не связано с работой с файлами, и показывает, что это просто удобство. В других редакторах вы сначала делаете «convert-> 8bit», а затем «save as». Что касается выбора уровня сжатия почтового индекса, я не думал об этом. Но (поскольку он без потерь) он не влияет на изображение, а только влияет на использование памяти для сжатия и распаковки (в 7-zip вы можете увидеть оценку). Agent_L 8 лет назад 2
Если говорить о paint.net, «Уровень дизеринга» и «Битовая глубина» - это два разных параметра, которые мы можем установить при сохранении изображения в формате PNG. И мы можем иметь разные эффекты и изображения разных размеров, играя с каждой опцией. TecMan 8 лет назад 0
@TecMan: Когда вы устанавливаете уровень сжатия с помощью 7-Zip или любого другого архиватора, его можно извлечь из ZIP-файла? Точно так же это, кажется, не сохранено в заголовке PNG также. Что касается [дизеринга] (http://en.wikipedia.org/wiki/Dither#Digital_photography_and_image_processing), то оно связано с уменьшением полос на изображении. Это никак не связано со сжатием PNG. Дело в том, * почему * вы хотите знать эти детали в первую очередь? Karan 8 лет назад 1
@Karan, В некоторых случаях мне нужно знать, смотрю ли я на скриншоты PNG с уменьшенным качеством или они отображают изображение на экране в точности так, как оно было. Как я вижу, формат PNG не позволяет нам хранить эту информацию и легко извлекать ее. TecMan 8 лет назад 0
@TecMan Любое снижение качества перед сохранением в формате PNG. Невозможно получить информацию обо всей истории обработки данного изображения в любом формате файла. Agent_L 8 лет назад 0
@TecMan: Я не могу вспомнить ни одного случая, когда знание уровня сжатия имело бы значение при просмотре снимков экрана, но, возможно, это важно для вас по какой-то причине. В любом случае, у вас есть ответ. Karan 8 лет назад 1
2
pvc

Оценить степень сжатия любого файла изображения на самом деле довольно просто. Вы должны знать ширину, высоту и битовую глубину изображения. Для того, чтобы рассчитать, сколько данных будет необходимы исходные данные изображения без сжатия, вы должны сделать эту простую вещь: raw data size = image width * image heigth * (bits per pixel / 8). Затем просто raw data sizeподелите на размер файла PNG, и вы получите приблизительный коэффициент сжатия (не точное значение из-за заголовков и т. Д.). Например, для изображения размером 640x480x32 потребуется 640 * 480 * (32 / 8)1 273 800 байт. Теперь давайте предположим, что ваш PNG имеет 200 КБ. Вы делите (200 * 1024) / 1273800. Это дает степень сжатия около 0,16.

И помните об одном факте. Иногда 24-битные изображения фактически сохраняются как 32-битные значения. Таким образом, вы должны принять это во внимание.

Это ручной и немного грубый расчет. Вопрос был об автоматическом способе узнать это. В любом случае +1 к вашему ответу. TecMan 8 лет назад 0