Предварительно умноженный альфа-канал
В компьютерной графике существует два разных способа представления непрозрачности значения цвета. 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*
метод, задаете цвет кисти или очищаете значение цвета, этот цвет указывается с помощью прямого альфа-цвета.
Значения пикселей, хранящиеся в растровом изображении или отрисовке, а также операции рисования или смешивания, работающие на этих поверхностях, используют предварительно подготовленный альфа-файл. При загрузке растровых изображений из файла их содержимое автоматически преобразуется в предварительно заданный формат. При вызове метода рисования Win2D его цвет преобразуется прямо в премультификатор, прежде чем происходит фактическое рисование.
Эффекты изображений Win2D используют смесь прямых и предварительно премультированных альфа-изображений. Некоторые эффекты работают в одном формате, некоторые из них зависят от другого, и некоторые предоставляют свойство для выбора. В документации по каждому типу эффекта описывается, какой альфа-режим он использует. Предполагается, что входные данные эффектов всегда премулируются, поэтому, когда эффект должен работать с прямым альфа-файлом, сначала будет применять нерекомендительное преобразование, вычислять эффект, а затем повторно премультировать выходные данные.
API-интерфейсы GetPixelBytes
растрового изображения , GetPixelColors
SetPixelBytes
и SetPixelColors
не выполняют никаких преобразований альфа-формата. Они просто передают битовые значения непосредственно в базовую текстуру GPU или из нее. Это позволяет наблюдать, какой альфа-формат Win2D используется внутри:
- Создание сеанса рисования в отрисовки
- Вызов
drawingSession.Clear(Colors.Tranparent)
Colors.Tranparent
определяется как R = 255, G = 255, B = 255, A = 0- Win2D преобразует это значение в предварительно заданный формат, возвращая R = 0, G = 0, B = 0, A = 0, A = 0
- Использование
GetPixelColors
для чтения содержимого отрисовки - Обратите внимание, что он содержит предварительно заданный формат RGB = 0, а не RGB = 255, как исходное прямое альфа-значение
Colors.Tranparent
Преобразование между альфа-форматами
Чтобы преобразовать прямое альфа-значение цвета в предварительно заданный формат, умножьте значения R, G и B на A. Чтобы преобразовать премультипированные в прямой, разделить 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