2015-07-06 2 views
0

Есть ли способ рассчитать максимальный размер, который может принимать любое сжатое с PNG изображение?Максимальный размер PNG в соответствии с разрешением

Мне нужно знать, что (например) PNG разрешения 350x350 (px) не может быть больше, чем «X» KB. (и для постоянного качества сжатия, например 90)

Значение «X» - это то, что я ищу. Или в математическом выражении

350px * 350px * (90q) < X KB 

Я не совсем знаком с алгоритмом сжатия PNG, но, вероятно, максимальное значением для определенного разрешения?

P.S. : PNG не имеет альфа - это случай.

+1

Связанный, возможно, дубликат: http://stackoverflow.com/questions/22502529/worst-png-compression-scenario – leonbloy

+0

Вы правы! У меня не было правильных тегов при поиске моей проблемы. – TheSquad

+0

Не смешивайте «разрешение» и «размер». * Разрешение * - абсолютное значение: количество пикселей на (абсолютное) единица измерения. Типичным элементом является «пиксель на дюйм» или «ppi». О чем вы спрашиваете, это * размер *, только в пикселях *. – usr2564301

ответ

0

В максимальном случае данные несжимаемы (например, если размер изображения равен 1x1, или если изображение больше, но содержит случайные несжимаемые данные). Таким образом, максимальный размер

8 // PNG signature bytes 
+ 25 // IHDR chunk 
+ 12 // IDAT chunk (assuming only one IDAT chunk) 
+ height //pixels 
    * (1 // filter byte for each row 
     + (width // pixels 
     * 3 // Red, blue, green color samples 
     * 2 // 16 bits per color sample 
     ) 
    ) 
+ 6 // zlib compression overhead 
+ 2 // deflate overhead 
+ 12 // IEND chunk 

Сжатие "качество" не входит в это. Большинство приложений, вероятно, разделяют IDAT на более мелкие куски, обычно 8 килобайт каждый, , поэтому в случае изображения 350x350 будет 44 фрагмента IDAT, поэтому добавьте 43 * 12 для накладных расходов IDAT.

В качестве проверки, A 1x1 16-битный RGB-изображение может быть записано в виде 72-байтовый PNG и 1x1 8-битные оттенки серого изображения 67 байт. Если изображение чересстрочное или имеет какие-либо вспомогательные куски, или имеет альфа-канал, то он будет , естественно, больше.

+0

К сожалению, я забыл, что в прошлом году я ответил на дубликат этого вопроса. Там я сказал, что накладные расходы дефлята составляют 5 байт, но мои тесты показывают, что это может быть всего 2 байта. Я должен был перепутать биты и байты при чтении rfc-1951. –

+0

Принимая это в своих крайних случаях: является ли длина IDAT длиной в 1 байт? Ничто в спецификациях, по-видимому, не указывает на то, что это не так ... поэтому вы можете добавить * накладные * накладные расходы на 12 байт на кусок - каждый кусок одного входного байта! Я думаю, это зависит от того, почему OP (думает, что он) должен это знать. – usr2564301

+0

@ Jongware, Да, PNG с числом 1-байтовых данных (или даже нулевым байтом данных). Ключи IDAT действительны; декодер объединяет их содержимое для получения потока данных zlib. –

Смежные вопросы