Не могу найти логику за размерами файла png - PullRequest
4 голосов
/ 26 сентября 2011

Я сохраняю большое количество небольших файлов png для использования в играх на телефоне, поэтому пространство стоит дорого.

Я пытаюсь разобраться в логике размеров файлов, чтобы я мог сохранять вещи наиболее эффективно, но даже после использования pngcrush размеры совершенно несовместимы.

Я сохранил изображение 1x1, и оно занимает 3 КБ. У меня есть другое изображение 23x21, которое занимает всего 2 КБ. У меня есть два изображения почти одинакового размера, но одно занимает 6 КБ, а другое - 13 КБ. Я удвоил высоту изображения и скопировал одно изображение в пустое пространство другого и сохранил его. Объединенное изображение только 11kb!

Почему изображение 1x1 больше, чем изображение 23x21? Почему я могу объединить изображение размером 13 КБ и изображение размером 6 КБ и получить изображение размером 11 КБ?

Вот изображения, о которых я говорю (между 1-м и 2-м изображениями 1х1 пиксель. Трудно увидеть, поэтому я просто дам URL: http://g42.org/temp/png/1x1.png):

пример http://g42.org/temp/png/hat.png пример http://g42.org/temp/png/1x1.png пример http://g42.org/temp/png/helmet1.png пример http://g42.org/temp/png/helmet2.png пример http://g42.org/temp/png/helmet1_2.png

Ответы [ 4 ]

6 голосов
/ 26 сентября 2011

Это не компрессия, проблема с изображением 1x1 состоит в том, что у него есть метаданные (кажется, добавленные Photoshop), цветовой профиль (блок iCCP).Если вы заглянете внутрь двоичного файла, его данные между строками «iCCP» и «IDAT» могут быть удалены, и вы получите файл размером 69 байт.Если вы снова откроете и сохраните файл для большинства программ просмотра изображений (xnview) или используете pngcrush, вы можете удалить этот фрагмент.: Смотрите здесь: enter image description here http://i.stack.imgur.com/fmOdA.png

А что касается изображений шлема: помимо других информационных фрагментов (imageReady рекламирует некоторый информационный текст, как вы можете видеть), разница заключается в разных форматах:-шлемы - изображение с палитрой (8 бит на пиксель), один шлем - RGB с альфа (32 бита на пиксель)

1 голос
/ 26 сентября 2011

Сжатие PNG основано на том же алгоритме, что и zlib, и очень чувствительно к сжатым данным, поэтому вы не увидите непротиворечивой связи между размером изображения и размером файла.В случае комбинированного изображения оно все еще больше, чем меньшее изображение, и, учитывая сходство двух половинок изображения, компрессор, вероятно, смог использовать много дерева Хаффмана.Я не знаю достаточно об алгоритме, чтобы точно сказать, как он оказался меньше, чем другая половина.

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

0 голосов
/ 27 сентября 2012

PNG имеет несколько подформатов: 24-битный с или без альфа, 8-битный (включает в себя альфа), оттенки серого и т. Д., Которые используют разное количество байтов на пиксель и имеют различную «сжимаемость».* Кроме того, PNG поддерживает несколько приемов сжатия (фильтры и настройки gzip), которые влияют на степень сжатия данных изображения.

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

  • ImageAlpha преобразует изображения в наиболее компактный альфа-вариант PNG8 +.

  • ImageOptim удаляет ненужные метаданные и находит лучшие параметры сжатия.

Благодаря комбинации этих двух изображений ваши изображения могут быть уменьшены на 30-50%.

0 голосов
/ 26 сентября 2011

Существует замечательная утилита pngcrush

http://pmt.sourceforge.net/pngcrush/

Сжатие в PNG является довольно сложной задачей - мы теряем предположения и стратегии, которые стоит попробовать - мы создаем палитру или нам лучше без нее?

PNGcrush существенно усиливает более 100 различных стратегий сжатия, одновременно обрезая ненужные теги и секции.

...