В этом посте разберём что такое цвет, как работает пиксель и многое другое.



Поехали!

Что такое цвет?



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

Это простое определение, но нам больше и не надо.

А что в мониторах?



Картинка на мониторе образуется тремя цветами: красный (R), зеленый (G) и синий (B) - RGB. Один светодиод в пикселе может показать 256 цветов (один байт) одного цвета из RGB. Всего цвета 3, значит - 256 оттенков на каждый: 256^3 = 16 777 216 всего оттенков может показать один пиксель.

В программировании, как мы знаем, все считается с 0, поэтому программисты записывают в диапазоне 0-255 (где 0 - полное отсутствие оттенка, а 255 - это самый сильный цвет), а не 1-256.

Факт: люди выбрали для оттенков один байт, почему? Потому что этого вполне достаточно, чтобы человеческий глаз это воспринял. До байта идет бит, а бит хранит только 1 или 0 - например только черный или только белый. Не вариант. После байта идет килобайт - это слишком много разных цветов. Был взят байт, то есть 2^8 оттенков


Почему килобайт это много? Давайте посмотрим, сколько цветов видит человек (и за одно других животных):

СуществоКол-во типов колбочекПримерное число оттенков / фича
Человек3 (RGB)~ 1-10 млн.
Креветка-богомол12–16Видит поляризацию и тепловые сигнатуры
Птицы4 (RGB + UV)> 100 млн (тетрахроматия)
Собаки2 (B + Y)~ 10 тыс. (мир желто-синий)
Змеи2 + тепловизорВидят инфракрасное изображение


Итак, человек видит не больше 10млн оттенков, тогда смысл делать больше?

Альфа канал



Продолжаем. У нас есть три канала: red, green, blue. Каждый можно записать числом от 0 до 255. Чёрный цвет — все светодиоды выключены (0, 0, 0), белый — все включены на полную (255, 255, 255).

Также существует ещё один канал: alpha — это «непрозрачность». Записывается после RGB: rgba — в конец. По смыслу она считается от 0 (полная прозрачность, «пустота») до 1 (полная непрозрачность). Компьютеру для хранения проще работать с целыми числами, поэтому внутри альфа-канал — это тоже диапазон 0–255. Отсюда и пошла запись вроде 255, 255, 255, 100, где последнее число — это байт прозрачности.

Однако современные языки и браузеры прекрасно понимают и дробную запись вроде 0, 0, 0, 0.5. Так человеку гораздо удобнее. Вы просто пишете 0.5, браузер пересчитывает это в байты с высокой точностью сам, а в память всё равно улетает целое число от 0 до 255.

Закономерный вопрос: а где середина (50%) у 255 в памяти?

Ответ: да нигде... 50% от 255 — это 127.5. Так как байт может быть только целым числом, ровной середины не существует. Будет либо 127 — это ≈ 49.8% (чуть меньше половины), либо 128 — ≈ 50.2% (чуть больше половины). На практике эта разница незаметна глазу.


Важно: непрозрачность — опциональный параметр. По умолчанию он равен `1.0` (полная непрозрачность), поэтому в большинстве случаев его можно не писать явно.


HEX и RGB(a)



HEX (сокращение от hexadecimal) — обозначение шестнадцатеричной системы счисления.


В общем, HEX - это шестнадцатеричная система счисления. Напомню, что в 16-ричной используются цифры 0-9 и латинские буквы A-F. Записывается следующим образом:

В десятичнойВ шестнадцатиричной
000
120A
16 (это максимум для 16-ричной)0F (максимум, если записывать одной цифрой)
12880
256FF


Один светодиод принимает число от 0 до 255, запись в десятичной системе последовательности, где пиксель покажет красный:
REDGREENBLUE
25500
Красный на полнуюПустота вместо зеленогоПустота вместо синего


Получается: RGB(255, 0, 0) - это запись в десятичной системе. Но в программировании для цветов также используют шестнадцатеричную систему. Тогда запись RGB(255, 0, 0) в десятичной становится #FF0000 (это красный!).

Почему "#"? Этот значок слеша хештега говорит явно компьютеру "Сейчас пойдет цвет в HEX!".


Как же составлять цвета? Дальше все просто: красный на первом месте, зеленый - на втором, синий - третий. Например красный - это 255, 0, 0, полностью синий - 0, 0, 255, а полностью зеленый - 0, 255, 0. Если все цвета повторять в одинаковых пропорциях, то мы увидим градиент от полностью черного (0, 0, 0) до полностью белого (255, 255, 255). Например 100, 100, 100 - это темно-серый цвет. 128, 128, 128 - это близко к самому обычному серому.

Теперь осталось научиться переводить десятичную в HEX: 0, 0, 0 в HEX: #000000, или 16, 32, 48 в HEX: #102030.

Цвет HEX может представляться в интересном формате: вместо 6 знаков FFFFFF можно написать просто FFF. Каждый символ повторится еще один раз: #FFF -> #FFFFFF, #A0A -> #AA00AA (розовый), #00F -> #0000FF.


Популярные цвета



ЦветHEXRGBОписание
Чёрный#0000000, 0, 0Абсолютная тьма, классика минимализма
Белый#FFFFFF255, 255, 255Чистота, свет, универсальный фон
Красный#FF0000255, 0, 0Энергия, сигнал опасности
Синий#0000FF0, 0, 255Спокойствие, доверие, цвет гиперссылок
Зелёный#00FF000, 255, 0Природа, разрешение, экология
Жёлтый#FFFF00255, 255, 0Солнце, радость, предупреждение
Серый (50%)#808080128, 128, 128Нейтралитет, строгость, фон интерфейсов
Тёмно-синий (Navy)#0000800, 0, 128Премиум, корпорации, официальность
Оранжевый#FFA500255, 165, 0Энтузиазм, тепло, призыв к действию
Розовый (Hot Pink)#FF69B4255, 105, 180Яркость, выделение акцентов


Немного практики



Теперь вы знаете, как работает цвет и его показ. Теперь советую закрепить знания и на листочке перевести HEX/10-тичную в название и наоборот:

1. #FFF -> ?
2. RGB(255, 255, 0) -> ?
3. RGBA(100, 100, 100, 0.1) -> ? c [ высокой | низкой ] прозрачностью
4. Чистый зеленый -> #...?
5. Серая кнопка -> RGB(?, ?, ?)
6. #FFAA00 -> #...? (сокращенный вид)

Конец!



Вы узнали про цвета, научились считать и составлять их.

К главной странице уроков