Direct2D. Эффект Saturation. Насыщенность

D2D1Saturation

Насыщенность — это второй важный параметр в теории цвета, наравне с яркостью. Определяет степень отличия чистого хроматического цвета от аналогичного ему по яркости ахроматического цвета. Ахроматический цвет — это оттенки серого, который мы получили в предыдущей статье.

Цитатник

Несколько цитат для более широкого освещения вопроса. Рекомендую почитать, что там под ссылками LookColor и Jotto. По-моему, очень толково расписано.

Насыщенный цвет можно назвать «сочным», «глубоким», менее насыщенный — «приглушённым», приближённым к серому. Полностью ненасыщенный цвет будет оттенком серого. Насыщенность (saturation) — одна из трёх координат в цветовых пространствах HSL и HSV.

WIKI

Насыщенность цвета (интенсивность) – это степень выраженности определенного тона. Понятие идет следующим после яркости.

LookColor

Насыщенность — одна из трёх основных характеристик цвета в живописи и цветоведении (теории цвета), вместе с цветовым тоном и светлотой. Это степень отличия хроматического (цветного, принадлежащего цветовому спектру) цвета от равного ему по светлоте ахроматического (бесцветного серого).

Jotto

Перейдем непосредственно к эффекту.

Эффект Saturation

Используется для изменения насыщенности изображения. Является специализированным вариантом цветовой матрицы.

Минимальные требования: Windows 8 и обновление платформы для Windows 7. Из чего следует, что делать расширенную версию функции эффекта, как, например, для Grayscale эффекта, не требуется. Но матрицу обязательно рассмотрим.

Снова используем модуль Winapi.D2DMissing. Причины детально описаны ранее.

CLSID для эффекта Saturation:

Эффект имеет единственное свойство.

D2D1_SATURATION_PROP_SATURATION
Насыщенность изображения. 
Информация из MSDN. Она не совсем точная. Поэтому курсивом.
Значение насыщенности имеет диапазон от 0 до 1. При значении 1, выходное изображение будет полностью насыщенным. Если значение установлено в 0, выходное изображение будет монохромным. 
Значение по умолчанию: 0.5f

Тип: FLOAT

Значение насыщенности на самом деле изменяется от 0 до 2.

Значение по умолчанию равно 1.0.

Таким образом, функция для эффекта предлагается следующая.

Цветовая матрица эффекта

Если снова обратимся к MSDN увидим следующую запись.

Рис.1. Матричное уравнение насыщенности. MSDN.

Как показали предыдущие статьи, Microsoft очень не любит писать толковую документацию, но в этот раз с уравнением все в порядке. Даже про альфа-канал не забыли.

Модифицируем код из статьи про ColorMatrix, добавим в контекстное меню пункт Saturation и поле для ввода значения насыщенности.

Рис.1. Унылый осенний пейзаж. Тест цветовой матрицы насыщенности.

После выбора пункта контекстного меню Saturation внизу появится поле ввода, куда внесем максимальное значение 200. У нас пока целочисленные спины в интерфейсе, поэтому принимаем за истинные значения умноженные на 100.

Рис.2. Солнечный и насыщенный осенний пейзаж.

Проверим непосредственно эффектом Saturation.

Рис.3. Эффект Saturation.

Разницы никакой. Цветовая матрица для эффекта насыщенности рабочая. MSDN опять дал правильные данные. Это даже удивляет.

Функция расчета насыщенности

Функция инициализации матрицы для изменения насыщенности.

Если внимательно приглядеться, увидим, что коэффициенты ровно те же, что мы использовали для расчета изображения в оттенках серого в рамках Grayscale HDTV. Все та же восприимчивость человеческого глаза к синему и зеленому. А не любопытно было бы попробовать коэффициенты из первого набора? Того, который мы используем сейчас по умолчанию для оттенков серого.

Насыщенность прекрасно считается, но результаты по сравнению с эффектом чуть-чуть отличаются. Оставлю тут «другую» матрицу для смелых экспериментаторов. Хочу заметить, что значения коэффициентов по диагонали в сумме должны дать 1. Сумма всех коэффициентов для R, G, B также должна дать 1.

То есть 0.299 + 0.701 = 1. И сумма всех коэффициентов 0.299 + 0.587 + 0.114 = 1.

Давайте напишем функцию изменения насыщенности цвета. Полезно при работе с цветовой гаммой интерфейса, чтобы не возникало аляповатостей. Предлагаю такой код.

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

Рис.4. Различие между насыщенностью и яркостью

В исходниках по ссылке ниже функция располагается в модуле IP76.DrawUtils. Там же находится и функция для яркости. Однако, так как сам грешу тем, что копирую прямо у себя же со страницы, привожу функции и для яркости.


Скачать

Исходники (Delphi XE 7-10) 1.09 Mб

Перед тем, как открыть проект, необходимо установить шрифт Font Awesome 5 Free-Solid-900.otf. Он находится в архиве в подпапке Fonts.

Исполняемый файл D2DEffects 0.4 (zip) 1.82 Мб


5 4 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x