Вопрос по png, compression, image-processing – Как определить размеры PNG на основе ограничения размера файла?

3

Если приложение имеет бизнес-логику, которая говорит, что 24-битный PNG никогда не может превышать 250 КБ, можно ли предсказать, какая наибольшая ширина & amp; высота, чтобы изображение могло и все еще подходило под требование 250 КБ?

Поскольку существует много переменных с глубиной цвета, альфа-каналами и т. Д., Возможно ли это узнать? Или приблизиться?

Правильно, это невозможно. Вы должны будете написать изображение в формате PNG, измерить его размер, и только тогда вы будете точно знать. Ani
Хотя вы можете найти максимальный размер, я не думаю, что это будет практично, так как если вы сжимаете действительно огромное сплошное изображение (например, все пустое) в PNG, это приведет к очень маленькому png-файлу. gusbro

Ваш Ответ

4   ответа
0

предполагая, что он не сжат. Умножьте width * height * 3 и добавьте немного для заголовка.

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

Это все еще не гарантирует, что результат будет достаточно маленьким, вы можете определить это, только фактически пытаясь выписать закодированное изображение. Однако это должно быть достаточно для всех, кроме самых вырожденных случаев.

Редактировать: если это не ясно, вы можете работать в обратном направлении и получать размеры изображения от максимального размера файла. Если предположить,w а такжеh максимально допустимая ширина и высота,a это соотношение сторонw/h, а такжеr соотношение размера файла / размера изображения, обнаруженное выше:

w = sqrt((250K * a) / (r * 3))
h = w / a

Так, например, еслиa было 1,5 аr было 0,5, ваши размеры будут 500 х 333.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

если вы сохраните огромный пустой файл в формате png, он будет иметь очень маленький размер из-за сжатия png.

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

Error: User Rate Limit Exceeded
1

Предполагая, что сжатие совершенно неэффективно для сценария наихудшего случая, каждый пиксель будет хранить 8 байтов данных, 2 байта для каждого R, G, B & amp; О. Таким образом, изображение размером 100x100 пикселей будет иметь максимальный размер 80 000 байт плюс некоторые незначительные метаданные.

После выполнения этих простых вычислений я провел ряд экспериментов с разноцветными разноцветными фотографиями, и я никогда не получал более трети этого размера, около 30 КБ на 10 000 пикселей.

Вооружившись этими знаниями, я составил рекурсивную функцию, которая уменьшает входной png на 10% до тех пор, пока размер не станет ниже предела, и, сохранив правильные размеры с полученным изображением, я восстановил его на целевых объектах. Это привело к лучшему, хотя и переменному, качеству, правильному размеру и незначительной дополнительной нагрузке на ЦП (потому что на практике никогда не было уменьшения).

Эта спецификация png - это то, на что я положился, чтобы сделать свои предположения: http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html

Вы также можете взглянуть на статью в Википедии: https://en.wikipedia.org/wiki/Portable_Network_Graphics

4

но, вероятно, бесполезно. PNG-сжатие zlib имеет максимальную степень сжатия 1032: 1 (для длинной последовательности с одним и тем же байтовым значением). Таким образом, сжатые 250 КБ будут (без учета оболочек и еще много чего) около 250 МБ без сжатия. Для квадратного изображения это будет почти 10000 x 10000 пикселей при трех байтах на пиксель.

Обратите внимание, что другой ответ здесь необъяснимо предполагаетminimum сжатие, которое даетminimum количество пикселей, например 500 х 333. Поскольку заданный вопрос "наибольшая ширина & amp; высота, на которой изображение может быть & quot ;, этот ответ бесполезен. Очевидно, что 10000 х 10000 больше, чем 500 х 333.

Update:

Точный расчет, основанный на минимальном PNG-файле, приводит к тому, что это максимальное количество 24-битных пикселей (три байта на пиксель, как хранится в сжатых данных) как функция размера файлаn байт:

floor(((n - 77) * 8 - 1) / 2) * 86 + 1

Таким образом, для 250 * 1024 = 256 000 байтов мы получаем 88 037 427 пикселей. Для квадратного изображения это будет около 9383 x 9383 пикселей.

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