Все сводится к сжатию.
Примечание. Этот ответ пытается быть техническим, но на понятном уровне. Следовательно, могут быть некоторые (надеюсь, небольшие) неточности.
Различные форматы файлов имеют разные методы для достижения разных целей. Например, BMP , TIF и OpenEXR могут быть сохранены с разными алгоритмами сжатия или вообще без сжатия. Таким образом, пользователь может решить, хотят ли они иметь большие файлы, которые можно сохранить с меньшим временем процессора или меньшие файлы, которые потребуют дополнительных вычислений.
PNG , как и JPEG , не предлагает модульное решение. PNG всегда будет сжиматься с помощью некоторой фильтрации (то есть кодер будет искать способ эффективно «упаковать» пиксели), а затем сжимать его с помощью DEFLATE , который в основном пытается уменьшить избыточные данные 1 и затем он использует таблицу Хаффмана / Run Length Encoding , которая в основном пытается сохранить информацию в двоичном виде наиболее эффективным способом. Оба подэтапа без потерь и относительно легко вычисляются.
1 Сокращение избыточных данных: например, поле проверки 8x8 можно сохранить как 1 черный и 1 белый квадрат, каждый из которых повторяется 32 раза в чередующемся порядке.
Базовый пример:
Скажем, ваше 32-битное изображение выглядит так:

Украдено у Статья Википедии о смешивании цветов
Это изображение содержит 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: если вы заботитесь о размере файла, попробуйте подойти к этой теме с разумным отношением «сколько мне нужно?». Если вам не важен размер файла, используйте столько бит на пиксель, сколько хотите.