Direct2D. ColorMatrix. Цветовая матрица

ColorMatrix

ColorMatrix — это мощный инструмент для работы с растровым изображением. С помощью матрицы можно удалять, комбинировать, менять местами цветовые каналы изображения. Можно вращать цветовой вектор. Многие эффекты являются просто частным случаем цветовой матрицы. Одним словом, ColorMatrix — это сила.

Немного теории

Цветовая матрица в теории представляет собой матрицу 5×5, но т.к. последний столбец не используется на практике принято брать матрицу 5×4. Преобразование осуществляется по следующей формуле.

Latex formula

Позволю себе немного преобразовать уравнение.

Рис.1. ColorMatrix с формулами расчета для каждого канала.

Эффект ColorMatrix

Эффект доступен для Windows 8 и обновления платформы для Windows 7. Это значит, что если какой-то эффект существует начиная с Windows 10, возможно, его можно продублировать эффектом цветовой матрицы. Что мы и сделаем чуть позже.

Нам по-прежнему (и всегда) нужен модуль Winapi.D2DMissing из библиотеки SVGIconImageList. Также, описания некоторых типов берем из DX12.D2D1.pas. Почему так происходит описано ранее.

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

Эффекту цветовой матрицы требуются свойства:

D2D1_COLORMATRIX_PROP_COLOR_MATRIX
Матрица 5×4 значений типа Single. 
Элементы в матрице не ограничены и безразмерны.
По умолчанию используется единичная матрица
(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0).
Тип: D2D1_MATRIX_5X4_F.
D2D1_COLORMATRIX_PROP_ALPHA_MODE
Альфа-режим вывода. Расшифровка ниже.
Тип: D2D1_COLORMATRIX_ALPHA_MODE.
Значение по умолчанию: D2D1_COLORMATRIX_ALPHA_MODE_PREMULTIPLIED.
D2D1_COLORMATRIX_PROP_CLAMP_OUTPUT
Ограничивает ли эффект значения цвета от 0 до 1 до того, как эффект передает значения следующему эффекту. 
Тип: BOOL.
Значение по умолчанию: FALSE.

Альфа-режимы

D2D1_COLORMATRIX_ALPHA_MODE_PREMULTIPLIED
Эффект предварительно перемножает компоненты R, G, B на значение альфы A. После этого применяет цветовую матрицу. На выходе производит ту же операцию с умножением.
D2D1_COLORMATRIX_ALPHA_MODE_STRAIGHT
Эффект применяет цветовую матрицу сразу ко входу, без предварительного умножения.

Тип, описывающий альфа-режимы.

Матрица D2D1_MATRIX_5X4_F

Тип матрицы берем из вышеупомянутого DX12.D2D1.pas. По большому счету, можно было бы обойтись простым объявлением двумерного массива. Но если есть более продвинутая структура, с инициализацией, то почему бы и нет.

И реализация. Ничего особенного, просто много однообразного текста.

Два метода TD2D_MATRIX_5X4_F.Init

[свернуть]

Функция эффекта

Структура функции ничем особо не отличается от ранее представленных эффектов.

Применение функции аналогично этому ранее описанному методу. Вместо GetBrightnessEffect используем GetColorMatrixEffect.

Практика

Вообще, с помощью ColorMatrix можно делать удивительные вещи. В будущем, при описании нового эффекта, буду предоставлять матрицу, на основе которой этот эффект реализован. Сейчас, для разгона, начнем с простого.

В своем изначальном состоянии цветовая матрица является единичной. То есть, красный переходит в такой же красный, синий — в синий, и так далее, без изменений.

Рис.2. Единичная цветовая матрица не приводит к преобразованию каналов.

Поменять местами каналы

Однако, если сделать небольшие изменения в единичной матрице, такие как на рис.3, вид изображения кардинально меняется.

Рис.3. Поменять местами красный и синий каналы
Рис.4. Результат смены каналов

Как видим, небо из категорически красного стало бескомпромиссно синим.

Выделить или усилить канал

Складывается ощущение, что зеленого в картинке нет вообще. Не меняя матрицы, в ячейку GG’ вместо 1 впишем 3. Получится следующее.

Рис.5. Смена каналов и усиление зеленого.

Интересно использовать альфа канал для усиления. Например, вот такая полупрозрачная абстракция. В ячейку AG’ вобью 0.5. Xочу получить на выходе усиление зеленого за счет альфа канала.

Рис.6. Матрица усиления зеленого канала за счет альфа-канала
Рис.7. Усиление зеленого канала за счет альфа-канала

Перенос канала

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

Рис.8. Матрица переноса зеленого канала

От предыдущей матрицы отличается тем, что никакого умножения на значение альфа не происходит. Буквально все значения зеленого канала просто увеличиваются на 0.5. В результате видим следующее.

Рис.9. Результат переноса зеленого канала

Отличие рисунка 9 и рисунка 7 видно на глаз. Поэтому можем с уверенностью заявлять, что альфа-канал участвует в расчетах наравне с прочими, и MS в очередной раз огорчает небрежностью в описании этого эффекта.

Рис.10. MSDN забыл про альфа-канал

Инвертировать изображение

Материала достаточно, чтобы сделать первое серьезное преобразование изображение. Инвертировать изображение, пожалуй, самый простой пример применения ColorMatrix.

Матрица инвертирования приведена на рисунке 11. Почему так, и что такое инвертировать, подробно изложено ранее. Там же пример использования цветовой матрицы в GDI+.

Рис.11. Цветовая матрица инвертирования.

Применим матрицу на какой-нибудь абстрактной картинке.

Рис.12. Инвертированное изображение через цветовую матрицу.

Но давайте проверим, правильно ли инвертирует и эффект и матрица. У нас есть эффект Direct2D Invert. применим его к тому же самому изображению.

Рис.13. Инвертированное изображение через эффект.

Видим, что картинки идентичны. Эффект Direct2D Invert работает только начиная с Windows 10. В то время как ColorMatrix существует со времени появления версии 1.1. Казалось бы, зачем вообще использовать эффект D2D1Invert. По заверениям Microsoft эффекты, использующие цветовую матрицу, оптимизированы под сферу своего применения. Верить или нет, дело личное. Три последние статьи, включая эту, наглядно показывают ошибки в документации MSDN. Прироста в скорости лично я не заметил.

Рассмотрим два эффекта Direct2D, которые не имеют параметров и используют цветовую матрицу.

Direct2D. Эффект Invert.

Эффект инвертирует цвета изображения. Параметров не имеет. Минимальная платформа Windows 10.

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

Функция для эффекта принимает только контекст и изображение.

Результат работы представлен на рис.13. Алгоритм работы с эффектом предполагается следующий. Вначале происходит попытка получить эффект Invert. Если эффект получить не удалось, применяется эффект ColorMatrix. Давайте напишем функцию для эффекта, учитывающую этот алгоритм.

Проверяем на Windows 7 с пакетом обновлений для Windows 8. На рисунке 14 видно, что это Windows 7. Определяет, что эффект доступен и прекрасно работает. Теперь то же самое сделаем с эффектом Grayscale, который пока недоступен.

Рис.14. Инвертирование с учетом версии Windows.

Direct2D. Эффект Grayscale

Эффект преобразует цвета изображения в оттенки серого. Параметров не имеет. Минимальная платформа Windows 10.

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

Функция для эффекта принимает только контекст и изображение.

Перед тем, как рисовать расширенную функцию для оттенков серого, давайте разберемся с цветовой матрицей. Согласно MSDN (хм…) матрица имеет следующий вид.

Рис.15. Цветовая матрица для преобразования в оттенки серого. MSDN

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

Ради разнообразия запустим на Windows 8.

Рис.16. Преобразование в оттенки серого теперь от версии WIndows не зависит

Как видим, переключатель Grayscale теперь активен и прекрасно работает.

О происхождении коэффициентов. Связано с особенностью восприятия разных цветов человеческим глазом. Есть другие варианты коэффициентов. Процитирую википедию:

Для учёта особенностей восприятия изображения человеческим глазом (чувствительность к зелёному и синему цвету) в модели HDTV используют другие коэффициенты:

Y’ = 0.2126R + 0.7152G + 0.0722B

WIKI

Визуально получается то же самое, что и на рисунке 16. Поэтому приводить не стану. Но эти коэффициенты еще появятся в дальнейшем.

В примере по ссылке в конце статьи на цветовой матрице есть контекстное меню. Пункт Grayscale HDTV отвечает за цветовую матрицу именно с этими коэффициентами.

Анонс

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

Если эти темы интересны, подписывайтесь на телегу, оставляйте комментарии, буду знать, что не одинок.


Скачать

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

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

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


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