Почему размер сохраненного изображения не меняется с 32-битного PNG на 8-битный PNG? - Фотопедия
2 голосов
/ 27 марта 2018

У меня есть 32-битный PNG, преобразовывающий в 8-битный в Photoshop. В моем понимании преобразование должно уменьшить размер файла изображения до четверти его оригинала (потому что 32/8 = 4). Скажем, файл размером 32 КБ размером 750 КБ должен иметь размер 8-битного PNG ~ 188 КБ, но мое 8-битное изображение по-прежнему имеет размер 333 КБ. Почему?

enter image description here

Ответы [ 3 ]

4 голосов
/ 27 марта 2018

В моем понимании преобразование должно уменьшить размер файла изображения до четверти его оригинала (потому что 32/8 = 4).

Изображения PNG сжимаются, поэтому ваш файл размером 750 КБ уже намного меньше того, что вы получили бы, если бы умножили количество пикселей в изображении на 4 байта (или 32 бита). Когда вы преобразуете в 8 бит, вы уменьшаете объем информации, которую необходимо сохранить, но не уменьшаете ее в 4 раза.

3 голосов
/ 28 марта 2018

Все сводится к сжатию.

Примечание. Этот ответ пытается быть техническим, но на понятном уровне. Следовательно, могут быть некоторые (надеюсь, небольшие) неточности.

Различные форматы файлов имеют разные методы для достижения разных целей. Например, BMP , TIF и OpenEXR могут быть сохранены с разными алгоритмами сжатия или вообще без сжатия. Таким образом, пользователь может решить, хотят ли они иметь большие файлы, которые можно сохранить с меньшим временем процессора или меньшие файлы, которые потребуют дополнительных вычислений.

PNG , как и JPEG , не предлагает модульное решение. PNG всегда будет сжиматься с помощью некоторой фильтрации (то есть кодер будет искать способ эффективно «упаковать» пиксели), а затем сжимать его с помощью DEFLATE , который в основном пытается уменьшить избыточные данные 1 и затем он использует таблицу Хаффмана / Run Length Encoding , которая в основном пытается сохранить информацию в двоичном виде наиболее эффективным способом. Оба подэтапа без потерь и относительно легко вычисляются.

1 Сокращение избыточных данных: например, поле проверки 8x8 можно сохранить как 1 черный и 1 белый квадрат, каждый из которых повторяется 32 раза в чередующемся порядке.


Базовый пример:

Скажем, ваше 32-битное изображение выглядит так:

Subtractive color wheel

Украдено у Статья Википедии о смешивании цветов

Это изображение содержит 8 цветов - голубой (RGB 0, 1, 1 2 ), зеленый (RGB 0, 1, 0), желтый (RGB 1, 1, 0), красный (RGB 1, 0, 0), пурпурный (RGB 1, 0, 1), синий (RGB 0, 0, 1), черный (RGB 0, 0, 0) и белый (RGB 1, 1, 1). Следовательно, его можно (теоретически) сохранить, сказав From pixel position X=0 Y=0 to X=100 Y=0: RGB=1, 1, 1; from pixel position X=101 Y=0: RGB=0, 1, 1; [...] (это DEFLATE-часть), а затем эта информация сохраняется с помощью кодирования Хаффмана, что означает, что наиболее повторяющаяся часть информации получает двоичное значение 0, вторая самая повторяющаяся часть получает 10, третья самая повторяющаяся часть получает 110 и т. П.

2 Представление от 0 до 1, как обычно для 32-битных изображений.

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


Теперь, если вы конвертируете изображение из 32-битного в 8-битное (или выполните какое-либо преобразование с понижением частоты), все, что происходит, - это то, что дискретные значения получат новую, более грубую шкалу (как в: меньше подэтапов). Например, 32-битный пиксель должен хранить информацию для каждого канала с шагом 0.000000001 от 0 до 1, тогда как 8-битный пиксель должен хранить ту же информацию с шагом 1 в диапазоне от 0 до 255. Каждое значение из 32-битного теперь должно быть сопоставлено с новым значением в нашей 8-битной шкале, что означает, что, как правило, многие значения 32-битной шкалы будут упакованы в одно значение 8-битной шкалы.

Однако у нашего изображения нет градиентов, а только сплошные цвета, поэтому нам не нужно было сохранять наше изображение с точностью 0.000000001 на канал на пиксель, в первую очередь - в действительности нам потребовалось бы только 8 различных значений .

Следовательно, наше 32-битное изображение в идеале не должно иметь в 4 раза больше размера файла 8-битного изображения, поскольку уменьшение глубины в битах может быть достигнуто без потерь (поэтому 8-битное изображение не меньше), а фильтрация и дефлирование должны уменьшить Размер файла 32-битного файла в первую очередь. Теперь, если мы добавим несколько градиентов, 8-битный будет либо гораздо более эффективным, либо намного хуже, так как он покажет артефактов полос .


Что это значит для вас:

Уменьшение битовой глубины не всегда приводит к уменьшению размера файла - особенно, когда в вашем кодеке реализовано сжатие. Однако это не означает, что 32-битный бесполезен каким-либо образом: всегда лучше работать с изображением (или с чем-нибудь, на самом деле) без сокращения его информации до тех пор, пока это возможно. Это, однако, не означает, что вы должны продолжать и сохранять все свои изображения как 64-битные OpenEXR: если вы заботитесь о размере файла, попробуйте подойти к этой теме с разумным отношением «сколько мне нужно?». Если вам не важен размер файла, используйте столько бит на пиксель, сколько хотите.

0 голосов
/ 29 марта 2018

Существует множество факторов, касающихся сжатия изображения и глубины цвета.

Насколько я понимаю, при преобразовании размер файла изображения должен уменьшиться до четверти исходного размера (потому что 32/8 = 4).

Нет. Преобразование понижает разрядность с 24 до 8. Если это был png с включенным альфа-каналом, прозрачность будет сброшена. Это битовая глубина, а не размер файла.

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

Фотография леса, в котором много мелких деталей и изменение цвета, будет значительно больше, чем фотография голубого неба.

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

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

Сжатие в основном говорит "Вот большая зона схожих цветов", и на изображении леса потенциально не может быть большая зона схожих цветов рядом друг с другом.

Где вы, возможно, заметите больше различий в сжатии, в цветных градиентах, где вы "сгладите" градиент 256 уровней до постерной версии , скажем, только 8 цветов для каждого градиента. Но опять же, зависит от фото, финальной палитры.

Если вы смените изображение, вы можете увеличить размер файла!

...