"Информатика (базовый и углублённый уровень)", Гейн А.Г., Сенокосов А.И.
Цветовое изображение состоит из пикселей, и для каждого нужно сохранить сведения о цвете. Цветовая модель задаёт способ записать эти сведения числами: например, RGB описывает цвет интенсивностями красного, зелёного и синего каналов. Глубина цвета показывает, сколько бит выделено на пиксель и сколько оттенков можно закодировать. Другой подход — индексное кодирование: пиксель хранит номер цвета в палитре. Понимание этих способов помогает оценивать размер изображения и выбирать подходящее кодирование.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Цветовая модель — способ представить цвет с помощью набора числовых компонентов. Разные модели подходят для разных устройств и задач: экрану удобно задавать световые составляющие, а для других способов работы с цветом могут использоваться иные компоненты. Модель нужна, чтобы однозначно записывать и обрабатывать цвет.
Модель RGB задаёт цвет интенсивностями красного (R), зелёного (G) и синего (B) каналов. Каждый компонент показывает, насколько ярко соответствующий цветной свет участвует в итоговом цвете. Такое представление удобно для экранов, где изображение создаётся из светящихся пикселей.
Глубина цвета — количество бит, выделенное для кодирования цвета одного пикселя. Чем больше бит, тем больше разных кодов можно использовать и тем шире набор доступных оттенков. Это понятие помогает сравнивать цветовые возможности изображения и оценивать объём его данных.
Палитра — набор цветов, заданных для изображения. При индексном кодировании пиксель хранит не полный состав цвета, а номер соответствующей записи в палитре. Такой подход полезен, если изображение использует ограниченное число цветов.
Экран создаёт цвета смешением красного, зелёного и синего света. Эти компоненты действуют одновременно, поэтому итоговый цвет зависит от интенсивности каждого канала: если все выключены, свет не излучается и пиксель выглядит чёрным; если все работают с максимальной интенсивностью, получается белый. Изменяя соотношение каналов, экран формирует другие цвета и оттенки.
Чтобы сохранить цвет пикселя, компьютер записывает значения каналов RGB двоичными числами. Например, при восьми битах один канал может иметь 2⁸ = 256 уровней интенсивности. Если бит на все три канала поровну, общая глубина складывается: 8 + 8 + 8 = 24 бита на пиксель. Поэтому число возможных комбинаций составляет 2²⁴.
Для любого способа кодирования действует правило: i бит дают 2ⁱ возможных кодов, потому что каждый бит может принимать одно из двух значений. Увеличение глубины добавляет коды, а значит, позволяет различать больше оттенков. Но каждый дополнительный бит приходится хранить для каждого пикселя, поэтому объём несжатых данных растёт вместе с глубиной цвета.
При индексном кодировании пикселю назначают номер цвета в палитре, а не записывают значения всех цветовых компонентов. Если в палитре 256 цветов, индекс можно хранить в 8 битах, поскольку 2⁸ = 256. Это экономит место по сравнению с 24-битным RGB, но изображение ограничено цветами, которые есть в палитре; оттенок, которого в ней нет, напрямую задать нельзя.
Для предварительной оценки объёма несжатых данных перемножают число пикселей и глубину цвета. Результат получается в битах, поэтому его делят на 8, чтобы получить байты. Для индексного изображения к данным пикселей нужно добавить память палитры, а для оценки размера файла — учитывать также заголовок и применённое сжатие. Поэтому рассчитанный объём пикселей не всегда совпадает с размером файла.
| Свойство | RGB-кодирование | Индексное кодирование |
|---|---|---|
| Что хранится для каждого пикселя | Значения цветовых каналов | Номер цвета в палитре |
| Как задаётся цвет | Интенсивностями красного, зелёного и синего | Выбором записи из палитры |
| Связь с глубиной цвета | Глубина складывается из битов каналов | Глубина задаёт число бит для номера цвета |
| Преимущество | Можно задавать широкий набор цветов без фиксированной палитры | Меньше данных на пиксель при небольшом наборе цветов |
| Ограничение | На пиксель может требоваться больше бит | Доступны только цвета палитры, которая тоже занимает память |
При выборе способа сначала смотрите, что записывается для одного пикселя, а затем учитывайте дополнительные данные. RGB удобен для широкого диапазона цветов, а индексы — когда достаточно ограниченной палитры. Для честного сравнения объёмов учитывайте и память самой палитры.
В модели RGB каждому каналу отведено по 8 бит. Определите глубину цвета и максимальное число кодируемых цветов. Сначала нужно понять, сколько бит приходится на один пиксель в целом, а затем применить правило: i бит дают 2ⁱ кодов. Предполагается, что используются все возможные комбинации значений трёх каналов.
Ответ: глубина цвета — 24 бита на пиксель, максимально кодируется 16 777 216 цветов.
Изображение размером 800 × 600 пикселей хранится без сжатия с глубиной цвета 24 бита. Оцените объём данных в байтах и килобайтах. Считаем только данные пикселей, без заголовка файла и других служебных сведений. Для перевода используем 1 КиБ = 1024 байта.
Ответ: 1 440 000 байт, или 1406,25 КиБ при 1 КиБ = 1024 байта. Это оценка несжатых данных пикселей, а не обязательно размер готового файла.
Для изображения 256 цветов выбирают индексное кодирование с палитрой или RGB с 8 битами на канал. Сравните объём данных пикселей изображения размером 1024 × 768 без учёта заголовка файла. Для палитры из 256 цветов требуется 8-битный индекс, а RGB использует 24 бита на пиксель. Отдельно проверим, как палитра влияет на итог.
Ответ: данные пикселей занимают 786 432 байта при индексном кодировании и 2 359 296 байт при RGB. Если палитра хранится в файле, к индексному варианту нужно добавить её 768 байт; он всё равно значительно компактнее.
Ошибка — считать, что 8 бит на каждый канал RGB означают глубину 8 бит на пиксель. Её допускают, когда смотрят на число бит для одного канала и забывают о двух остальных. Проверьте себя: сложите биты R, G и B; здесь получается 8 + 8 + 8 = 24.
Ошибка — путать число бит и число доступных цветов. При i битах получается 2ⁱ кодов, а не i цветов, потому что каждый бит имеет два возможных значения. Чтобы проверить результат, возведите 2 в степень, равную числу бит; например, 8 бит дают 256 кодов.
Ошибка — при индексном кодировании учитывать только индексы и забывать палитру. Это происходит потому, что палитра не записана внутри каждого пикселя, хотя её цвета тоже нужно где-то хранить. Проверьте, входит ли она в файл: если входит, прибавьте её объём к данным пикселей.
Ошибка — не переводить биты в байты или принимать объём пикселей за размер файла. В первом случае результат выражен не в тех единицах, а во втором не учтены заголовок и сжатие. Проверяйте единицы на каждом шаге: делите биты на 8, а затем отдельно уточняйте, оцениваете ли несжатые данные или готовый файл.
Чтобы выполнять расчёты, нужно знать двоичное представление чисел и понимать, что каждый бит хранит один из двух вариантов. Также понадобятся единицы измерения информации и перевод битов в байты: без этого легко получить результат не в тех единицах. Эти знания связывают кодирование цвета с общими способами представления данных в компьютере.
Тема пригодится, когда нужно оценить объём графического файла, выбрать формат изображения или настроить качество цветной картинки. Сравнение глубины цвета и палитры помогает понять, почему файлы одного разрешения могут занимать разное место. При выборе следует учитывать не только число цветов, но и сжатие, которое влияет на размер файла.
Почему в модели RGB используют именно три канала?
Экраны создают цвет смешением красного, зелёного и синего света. Изменяя интенсивность каждого из этих трёх компонентов, можно получить множество оттенков. Поэтому для описания цвета на экране достаточно трёх каналов.
Сколько цветов можно закодировать 24 битами?
24 бита дают 2²⁴ = 16 777 216 различных кодов. В RGB это обычно по 8 бит на каждый из трёх каналов, то есть 256 уровней интенсивности для каждого.
Почему при увеличении глубины цвета растёт размер изображения?
Для каждого пикселя приходится хранить больше бит. Если число пикселей не меняется, объём несжатых данных увеличивается пропорционально глубине цвета.
Чем индексное кодирование отличается от RGB?
В RGB для каждого пикселя хранят значения цветовых каналов. При индексном кодировании пиксель содержит номер цвета в палитре, а сами цвета записаны отдельно.
Нужно ли учитывать палитру при расчёте размера индексного изображения?
Да. Помимо индексов пикселей, файл должен хранить цвета палитры, если она не задана отдельно. Поэтому полный объём включает данные пикселей и память, занятую палитрой, а иногда и заголовком.
§ 14. Кодирование цветовой информации