Предварительно умноженный альфа-канал
В компьютерной графике существует два разных способа представления непрозрачности значения цвета. Win2D использует оба метода. В этой статье объясняется, какая разница и где используется.
Прямая альфа-версия
При использовании прямого, также известного как линейный, альфа::
- Значения RGB определяют цвет отрисовываемого объекта
- Альфа-значение указывает, насколько он твердый
В этом мире RGB и альфа независимы. Вы можете изменить одно, не влияя на другое. Чтобы объект исчезал, необходимо постепенно уменьшать его альфа-значение, оставляя RGB без изменений.
Чтобы выполнить исходное смешение двух цветов, использующих прямой альфа-формат, выполните следующие действия:
result = (source.RGB * source.A) + (dest.RGB * (1 - source.A))
Предварительно умноженный альфа-канал
При использовании предварительной альфа-версии:
- RGB указывает, сколько цветов нарисуемая вещь влияет на выходные данные
- Альфа-значение указывает, насколько оно скрывает все, что находится за ним
В этом мире RGB и альфа связаны. Чтобы сделать объект прозрачным, необходимо уменьшить как его RGB (чтобы уменьшить цвет), так и его альфа(чтобы скрыть меньше того, что стоит за ним). Полностью прозрачные объекты больше не имеют цвета вообще, поэтому существует только одно значение, представляющее 100 % прозрачность: RGB и альфа все ноль.
Чтобы выполнить наложение исходного кода между двумя цветами, используюющими предварительно заданный альфа-формат, выполните следующие действия:
result = source.RGB + (dest.RGB * (1 - source.A))
Предварительно подготовленный альфа используется для отрисовки графики, так как он дает лучшие результаты, чем прямой альфа-канал при фильтрации изображений или составлении различных слоев. Дополнительные сведения см. в статьях:
Альфа в Win2D
Win2D использует прямую альфа-версию в своей поверхности API, но предварительно подготовленный альфа-канал для внутренних операций отрисовки.
Windows.UI.Color
значения используют прямую альфа-функцию. Всякий раз, когда вы передаете цвет Draw*
в метод или Fill*
, задаете цвет кисти или очищаете значение цвета, этот цвет указывается с помощью прямой альфа-функции.
Значения пикселей, хранящиеся в растровом рисунке или объекте rendertarget, а также операции рисования или смешения, которые работают на этих поверхностях, используют предварительно замедленную альфа-версию. При загрузке растровых изображений из файла их содержимое автоматически преобразуется в предварительно заданный формат. При вызове метода рисования Win2D его параметр цвета преобразуется из прямого в предварительное до фактического рисования.
В эффектах изображений Win2D используется сочетание прямых и предварительно подготовленных альфа-эффектов. Некоторые эффекты работают в одном формате, другие — в другом, а некоторые предоставляют свойство для выбора. В документации по каждому типу эффекта описывается, какой альфа-режим используется. Входные данные эффекта всегда считаются предварительно подготовленными, поэтому, когда эффекту необходимо работать с прямой альфа-канал, сначала будет применено непредумышленное преобразование, вычисляется эффект, а затем выполняется повторная предварительная обработка выходных данных.
API-интерфейсы GetPixelBytes
растровых изображений , SetPixelBytes
, GetPixelColors
и SetPixelColors
не выполняют никаких преобразований в альфа-формате. Они просто напрямую передают битовые значения в базовую текстуру GPU или из нее. Это позволяет наблюдать, какой альфа-формат Win2D использует для внутреннего использования:
- Создание сеанса рисования на объекте rendertarget
- Вызовите
drawingSession.Clear(Colors.Tranparent)
Colors.Tranparent
определяется как R = 255, G = 255, B = 255, A = 0- Win2D преобразует это значение в предварительно подготовленный формат, возвращая R = 0, G = 0, B = 0, A = 0
- Используется
GetPixelColors
для чтения содержимого объекта rendertarget. - Обратите внимание, что он содержит предварительно заданный формат RGB = 0, а не RGB = 255, как исходное прямое альфа-значение
Colors.Tranparent
.
Преобразование между альфа-форматами
Чтобы преобразовать прямое значение альфа-цвета в предварительно заданный формат, умножьте его значения R, G и B на A. Чтобы преобразовать premultiplied в прямой, разделите R, G и B на A.
Обратите внимание, что информация о цвете часто представлена в виде значений байтов в диапазоне от 0 до 255 (например Windows.UI.Color
, структура состоит из 4 байтов). Это представление масштабируется в 255 раз, поэтому байтовое значение 255 фактически означает 1, а 128 — половину интенсивности. Этот коэффициент масштабирования необходимо учитывать при преобразовании формата, поэтому для преобразования Windows.UI.Color
из прямого в предварительное:
premultiplied.R = (byte)(straight.R * straight.A / 255);
premultiplied.G = (byte)(straight.G * straight.A / 255);
premultiplied.B = (byte)(straight.B * straight.A / 255);
premultiplied.A = straight.A;
Если у вас есть данные изображения, использующие неправильный альфа-формат, PremultiplyEffect
или UnPremultiplyEffect
их можно использовать для их преобразования.
Windows developer
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по