Поделиться через


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

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