Предварительно умноженный альфа-канал

В компьютерной графике существует два разных способа представления непрозрачности значения цвета. 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 их можно использовать для их преобразования.