Класс AlphaComposite
- Все реализуемые интерфейсы:
Composite
public final class AlphaComposite extends Object implements Composite
AlphaComposite реализует основные правила альфа-композиции для объединения цветов источника и назначения с целью получения эффектов смешивания и прозрачности при работе с графикой и изображениями. Конкретные правила, реализованные этим классом, представляют собой основной набор из 12 правил, описанных в статье Т. Портера и Т. Даффа «Compositing Digital Images», SIGGRAPH 84, 253–259. В остальной части этой документации предполагается, что читатель знаком с определениями и понятиями, изложенными в этой статье. Этот класс расширяет стандартные уравнения, определённые Портером и Даффом, добавляя ещё один множитель. Экземпляр класса AlphaComposite может содержать значение альфа-канала, используемое для изменения непрозрачности или покрытия каждого пикселя источника перед его применением в уравнениях смешивания.
Важно отметить, что уравнения, определённые в статье Портера и Даффа, предназначены для работы с компонентами цвета, предварительно умноженными на соответствующие компоненты альфа-канала. Поскольку классы ColorModel и Raster позволяют хранить данные пикселей как в предварительно умноженном, так и в непредварительно умноженном виде, перед применением уравнений все входные данные необходимо нормализовать до предварительно умноженного вида, а все результаты может потребоваться преобразовать обратно в формат, необходимый для назначения, прежде чем сохранять значения пикселей.
Также обратите внимание, что этот класс определяет только уравнения для объединения значений цвета и альфа-канала в чисто математическом смысле. Точность применения этих уравнений зависит от способа извлечения данных из источников и их сохранения в назначениях. Дополнительные сведения см. в разделе Особенности реализации.
В описании уравнения смешивания в статье Портера и Даффа используются следующие множители:
| Множитель | Определение |
|---|---|
| As | компонент альфа-канала пикселя источника |
| Cs | компонент цвета пикселя источника в предварительно умноженном виде |
| Ad | компонент альфа-канала пикселя назначения |
| Cd | компонент цвета пикселя назначения в предварительно умноженном виде |
| Fs | доля пикселя источника, которая участвует в формировании результата |
| Fd | доля пикселя назначения, которая участвует в формировании результата |
| Ar | компонент альфа-канала результата |
| Cr | компонент цвета результата в предварительно умноженном виде |
Используя эти множители, Портер и Дафф определяют 12 способов выбора множителей смешивания Fs и Fd для получения каждого из 12 желаемых визуальных эффектов. Уравнения для определения Fs и Fd приведены в описаниях 12 статических полей, задающих визуальные эффекты. Например, в описании SRC_OVER указано, что Fs = 1 и Fd = (1-As). После того как известен набор уравнений для определения множителей смешивания, его можно применить к каждому пикселю для получения результата с помощью следующего набора уравнений:
Fs = f(Ad)
Fd = f(As)
Ar = As*Fs + Ad*Fd
Cr = Cs*Fs + Cd*Fd Для обсуждения расширений уравнения смешивания из статьи Портера и Даффа будут использоваться следующие множители:
| Множитель | Определение |
|---|---|
| Csr | одна из исходных компонент цвета пикселя источника |
| Cdr | одна из исходных компонент цвета пикселя назначения |
| Aac | «дополнительный» компонент альфа-канала экземпляра AlphaComposite |
| Asr | исходный компонент альфа-канала пикселя источника |
| Adr | исходный компонент альфа-канала пикселя назначения |
| Adf | итоговый компонент альфа-канала, сохранённый в назначении |
| Cdf | итоговый исходный компонент цвета, сохранённый в назначении |
Подготовка входных данных
Класс AlphaComposite определяет дополнительное значение альфа-канала, применяемое к альфа-каналу источника. Это значение применяется так, как если бы к пикселю источника сначала применялось неявное правило SRC_IN относительно пикселя с указанным значением альфа-канала: исходный альфа-канал и исходные цвета источника умножаются на альфа-канал в AlphaComposite. В результате получается следующее уравнение для вычисления альфа-канала, используемого в уравнении смешивания Портера и Даффа:
As = Asr * Aac Все исходные компоненты цвета источника необходимо умножить на альфа-канал в экземпляре AlphaComposite. Кроме того, если источник не был представлен в предварительно умноженном виде, компоненты цвета также необходимо умножить на альфа-канал источника. Следовательно, уравнение для вычисления компонентов цвета источника для уравнения Портера и Даффа зависит от того, представлены ли пиксели источника в предварительно умноженном виде:
Cs = Csr * Asr * Aac (if source is not premultiplied)
Cs = Csr * Aac (if source is premultiplied) Альфа-канал назначения не требует корректировки:
Ad = Adr Компоненты цвета назначения нужно корректировать, только если они не представлены в предварительно умноженном виде:
Cd = Cdr * Ad (if destination is not premultiplied)
Cd = Cdr (if destination is premultiplied) Применение уравнения смешивания
Скорректированные значения As, Ad, Cs и Cd используются в стандартных уравнениях Портера и Даффа для вычисления множителей смешивания Fs и Fd, а затем результирующих предварительно умноженных компонентов Ar и Cr.
Подготовка результатов
Результаты требуется корректировать, только если они сохраняются обратно в буфер назначения, содержащий данные, не представленные в предварительно умноженном виде. Для этого используются следующие уравнения:
Adf = Ar
Cdf = Cr (if dest is premultiplied)
Cdf = Cr / Ar (if dest is not premultiplied) Обратите внимание, что деление не определено, если результирующий альфа-канал равен нулю. В этом случае деление опускается во избежание «деления на ноль», а все компоненты цвета устанавливаются в ноль. Рекомендации по производительности
По соображениям производительности желательно, чтобы объекты Raster, передаваемые методу compose объекта CompositeContext, созданного классом AlphaComposite, содержали данные в предварительно умноженном виде. Однако, если исходный Raster или целевой Raster не представлены в предварительно умноженном виде, до и после операции композиции выполняются соответствующие преобразования.
Особенности реализации
- Многие источники, например некоторые типы непрозрачных изображений, перечисленные в классе
BufferedImage, не хранят значения альфа-канала для своих пикселей. Для всех пикселей таких источников используется значение альфа-канала 1.0. - Во многих назначениях также нет места для хранения значений альфа-канала, полученных в результате вычислений смешивания, выполняемых этим классом. Поэтому такие назначения неявно отбрасывают результирующие значения альфа-канала, полученные этим классом. Рекомендуется, чтобы такие назначения рассматривали хранимые значения цвета как не представленные в предварительно умноженном виде, делили результирующие значения цвета на результирующее значение альфа-канала перед сохранением цветов и отбрасыванием альфа-канала.
- Точность результатов зависит от способа хранения пикселей в назначении. Формат изображения, обеспечивающий не менее 8 бит для хранения каждой компоненты цвета и альфа-канала, как минимум подходит для использования в качестве назначения при последовательности из нескольких операций композиции — от нескольких до десятка. Формат изображения, в котором для каждой компоненты отводится менее 8 бит, подходит лишь для одной или двух операций композиции, после чего ошибки округления начинают доминировать в результатах. Формат изображения, в котором компоненты цвета не хранятся отдельно, плохо подходит для смешивания любого типа с прозрачностью. Например,
BufferedImage.TYPE_BYTE_INDEXEDне следует использовать в качестве назначения для операции смешивания, поскольку каждая операция может приводить к большим ошибкам из-за необходимости выбирать пиксель из ограниченной палитры, чтобы приблизить результат уравнений смешивания. - Почти все форматы хранят пиксели в виде целых чисел, а не значений с плавающей точкой, используемых в приведённых выше эталонных уравнениях. Реализация может либо преобразовывать целочисленные значения пикселей в значения с плавающей точкой в диапазоне от 0.0 до 1.0, либо использовать немного изменённые версии уравнений, которые работают исключительно с целыми числами, но дают результаты, аналогичные результатам эталонных уравнений.
Обычно целочисленные значения соотносятся со значениями с плавающей точкой так, что целое число 0 соответствует значению с плавающей точкой 0.0, а целое число 2^n-1 (где n — количество битов в представлении) соответствует 1.0. Для 8-битных представлений это означает, что 0x00 соответствует 0.0, а 0xff — 1.0.
- Внутренняя реализация может приближённо вычислять некоторые уравнения, а также исключать отдельные шаги во избежание ненужных операций. Например, рассмотрим дискретное целочисленное изображение с непредварительно умноженными значениями альфа-канала, в котором для хранения каждой компоненты используется 8 бит. Сохранённые значения почти прозрачного затемнённого красного цвета могут выглядеть так:
(A, R, G, B) = (0x01, 0xb0, 0x00, 0x00)
Если использовать целочисленную арифметику и выполнить композицию этого значения в режиме
SRCбез дополнительного альфа-канала, расчёты покажут, что результат будет следующим (в целочисленном формате):(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
Обратите внимание, что промежуточные значения, всегда представленные в предварительно умноженном виде, позволят целочисленной компоненте красного цвета принимать только значения 0x00 или 0x01. При попытке сохранить этот результат обратно в назначение, не представленное в предварительно умноженном виде, деление на альфа-канал оставит нам очень мало вариантов для непредварительно умноженного значения красного цвета. В данном случае реализация, выполняющая вычисления с целыми числами без упрощений, скорее всего, получит следующие итоговые значения пикселя:
(A, R, G, B) = (0x01, 0xff, 0x00, 0x00)
(Обратите внимание, что 0x01, делённое на 0x01, даёт 1.0, что эквивалентно значению 0xff в 8-битном формате хранения.)
И наоборот, реализация, использующая вычисления с плавающей точкой, может получить более точные результаты и вернуться к исходному значению пикселя практически без ошибки округления. Реализация с целочисленной арифметикой также может решить, что, поскольку в пространстве с плавающей точкой уравнения сводятся к виртуальной операции NOP над значениями цвета, пиксель можно без изменений перенести в назначение, полностью избежав вычислений.
Все эти реализации пытаются соблюдать одни и те же уравнения, но используют различные компромиссы между целочисленной арифметикой и вычислениями с плавающей точкой, а также между упрощёнными и полными уравнениями. Учитывая такие различия, вероятно, лучше ожидать совпадения результатов между реализациями и форматами изображений только в предварительно умноженном виде. В этом случае оба результата, выраженные в предварительно умноженном виде, будут равны:
(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
и, следовательно, будут совпадать.
- Из-за упрощения уравнений для повышения эффективности вычислений некоторые реализации могут вести себя по-разному при получении результирующих значений альфа-канала 0.0 для назначения, не представленного в предварительно умноженном виде. Обратите внимание, что упрощение, при котором деление на альфа-канал исключается для правила SRC, технически некорректно, если знаменатель (альфа-канал) равен 0. Однако, поскольку точность результатов можно ожидать только при просмотре в предварительно умноженном виде, результирующее значение альфа-канала 0 по существу делает результирующие компоненты цвета несущественными, поэтому в этом случае не следует ожидать строго определённого поведения.
- См. также:
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final AlphaComposite |
Clear |
Объект AlphaComposite, реализующий непрозрачное правило CLEAR с альфа-каналом 1.0f. |
static final int |
CLEAR |
Очищаются и цвет, и альфа-канал назначения (правило Clear Портера — Даффа). |
static final AlphaComposite |
Dst |
Объект AlphaComposite, реализующий непрозрачное правило DST с альфа-каналом 1.0f. |
static final int |
DST |
Назначение остаётся без изменений (правило Destination Портера — Даффа). |
static final int |
DST_ATOP |
Часть назначения, находящаяся внутри источника, накладывается поверх источника и заменяет назначение (правило Destination Atop Source Портера — Даффа). |
static final int |
DST_IN |
Часть назначения, находящаяся внутри источника, заменяет назначение (правило Destination In Source Портера — Даффа). |
static final int |
DST_OUT |
Часть назначения, находящаяся за пределами источника, заменяет назначение (правило Destination Held Out By Source Портера — Даффа). |
static final int |
DST_OVER |
Назначение накладывается поверх источника, а результат заменяет назначение (правило Destination Over Source Портера — Даффа). |
static final AlphaComposite |
DstAtop |
Объект AlphaComposite, реализующий непрозрачное правило DST_ATOP с альфа-каналом 1.0f. |
static final AlphaComposite |
DstIn |
Объект AlphaComposite, реализующий непрозрачное правило DST_IN с альфа-каналом 1.0f. |
static final AlphaComposite |
DstOut |
Объект AlphaComposite, реализующий непрозрачное правило DST_OUT с альфа-каналом 1.0f. |
static final AlphaComposite |
DstOver |
Объект AlphaComposite, реализующий непрозрачное правило DST_OVER с альфа-каналом 1.0f. |
static final AlphaComposite |
Src |
Объект AlphaComposite, реализующий непрозрачное правило SRC с альфа-каналом 1.0f. |
static final int |
SRC |
Источник копируется в назначение (правило Source Портера — Даффа). |
static final int |
SRC_ATOP |
Часть источника, находящаяся внутри назначения, накладывается на назначение (правило Source Atop Destination Портера — Даффа). |
static final int |
SRC_IN |
Часть источника, находящаяся внутри назначения, заменяет назначение (правило Source In Destination Портера — Даффа). |
static final int |
SRC_OUT |
Часть источника, находящаяся за пределами назначения, заменяет назначение (правило Source Held Out By Destination Портера — Даффа). |
static final int |
SRC_OVER |
Источник накладывается поверх назначения (правило Source Over Destination Портера — Даффа). |
static final AlphaComposite |
SrcAtop |
Объект AlphaComposite, реализующий непрозрачное правило SRC_ATOP с альфа-каналом 1.0f. |
static final AlphaComposite |
SrcIn |
Объект AlphaComposite, реализующий непрозрачное правило SRC_IN с альфа-каналом 1.0f. |
static final AlphaComposite |
SrcOut |
Объект AlphaComposite, реализующий непрозрачное правило SRC_OUT с альфа-каналом 1.0f. |
static final AlphaComposite |
SrcOver |
Объект AlphaComposite, реализующий непрозрачное правило SRC_OVER с альфа-каналом 1.0f. |
static final AlphaComposite |
Xor |
Объект AlphaComposite, реализующий непрозрачное правило XOR с альфа-каналом 1.0f. |
static final int |
XOR |
Часть источника, находящаяся за пределами назначения, объединяется с частью назначения, находящейся за пределами источника (правило Source Xor Destination Портера — Даффа). |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
CompositeContext |
createContext |
Создаёт контекст для операции композиции. |
AlphaComposite |
derive |
Возвращает аналогичный объект AlphaComposite, использующий указанное значение альфа-канала. |
AlphaComposite |
derive |
Возвращает аналогичный объект AlphaComposite, использующий указанное правило композиции. |
boolean |
equals |
Определяет, равен ли указанный объект этому AlphaComposite. |
float |
getAlpha() |
Возвращает значение альфа-канала этого AlphaComposite. |
static AlphaComposite |
getInstance |
Создаёт объект AlphaComposite с указанным правилом. |
static AlphaComposite |
getInstance |
Создаёт объект AlphaComposite с указанным правилом и постоянным значением альфа-канала, на которое умножается альфа-канал источника. |
int |
getRule() |
Возвращает правило композиции этого AlphaComposite. |
int |
hashCode() |
Возвращает хеш-код для этого объекта composite. |
Методы, объявленные в классе Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
protected void |
finalize() |
Устарело и подлежит удалению: этот элемент API может быть удалён в будущей версии. Финализация устарела и может быть удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством вызова notified или interrupted. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством вызова notified или interrupted, либо до истечения указанного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством вызова notified или interrupted, либо до истечения указанного промежутка реального времени. |
Подробное описание полей
CLEAR
@Native public static final int CLEAR
Fs = 0 и Fd = 0, следовательно:
Ar = 0 Cr = 0
- См. также:
SRC
@Native public static final int SRC
Fs = 1 и Fd = 0, следовательно:
Ar = As Cr = Cs
- См. также:
DST
@Native public static final int DST
Fs = 0 и Fd = 1, следовательно:
Ar = Ad Cr = Cd
- Начиная с:
- 1.4
- См. также:
SRC_OVER
@Native public static final int SRC_OVER
Fs = 1 и Fd = (1-As), следовательно:
Ar = As + Ad*(1-As) Cr = Cs + Cd*(1-As)
- См. также:
DST_OVER
@Native public static final int DST_OVER
Fs = (1-Ad) и Fd = 1, следовательно:
Ar = As*(1-Ad) + Ad Cr = Cs*(1-Ad) + Cd
- См. также:
SRC_IN
@Native public static final int SRC_IN
Fs = Ad и Fd = 0, следовательно:
Ar = As*Ad Cr = Cs*Ad
- См. также:
DST_IN
@Native public static final int DST_IN
Fs = 0 и Fd = As, следовательно:
Ar = Ad*As Cr = Cd*As
- См. также:
SRC_OUT
@Native public static final int SRC_OUT
Fs = (1-Ad) и Fd = 0, следовательно:
Ar = As*(1-Ad) Cr = Cs*(1-Ad)
- См. также:
DST_OUT
@Native public static final int DST_OUT
Fs = 0 и Fd = (1-As), следовательно:
Ar = Ad*(1-As) Cr = Cd*(1-As)
- См. также:
SRC_ATOP
@Native public static final int SRC_ATOP
Fs = Ad и Fd = (1-As), следовательно:
Ar = As*Ad + Ad*(1-As) = Ad Cr = Cs*Ad + Cd*(1-As)
- Начиная с:
- 1.4
- См. также:
DST_ATOP
@Native public static final int DST_ATOP
Fs = (1-Ad) и Fd = As, следовательно:
Ar = As*(1-Ad) + Ad*As = As Cr = Cs*(1-Ad) + Cd*As
- Начиная с:
- 1.4
- См. также:
XOR
@Native public static final int XOR
Fs = (1-Ad) и Fd = (1-As), следовательно:
Ar = As*(1-Ad) + Ad*(1-As) Cr = Cs*(1-Ad) + Cd*(1-As)
- Начиная с:
- 1.4
- См. также:
Clear
public static final AlphaComposite Clear
AlphaComposite объект, реализующий непрозрачное правило CLEAR с альфа-значением 1.0f.- См. также:
Src
public static final AlphaComposite Src
AlphaComposite объект, реализующий непрозрачное правило SRC с альфа-значением 1.0f.- См. также:
Dst
public static final AlphaComposite Dst
AlphaComposite объект, реализующий непрозрачное правило DST с альфа-значением 1.0f.- Начиная с:
- 1.4
- См. также:
SrcOver
public static final AlphaComposite SrcOver
AlphaComposite объект, реализующий непрозрачное правило SRC_OVER с альфа-значением 1.0f.- См. также:
DstOver
public static final AlphaComposite DstOver
AlphaComposite объект, реализующий непрозрачное правило DST_OVER с альфа-значением 1.0f.- См. также:
SrcIn
public static final AlphaComposite SrcIn
AlphaComposite объект, реализующий непрозрачное правило SRC_IN с альфа-значением 1.0f.- См. также:
DstIn
public static final AlphaComposite DstIn
AlphaComposite объект, реализующий непрозрачное правило DST_IN с альфа-значением 1.0f.- См. также:
SrcOut
public static final AlphaComposite SrcOut
AlphaComposite объект, реализующий непрозрачное правило SRC_OUT с альфа-значением 1.0f.- См. также:
DstOut
public static final AlphaComposite DstOut
AlphaComposite объект, реализующий непрозрачное правило DST_OUT с альфа-значением 1.0f.- См. также:
SrcAtop
public static final AlphaComposite SrcAtop
AlphaComposite объект, реализующий непрозрачное правило SRC_ATOP с альфа-значением 1.0f.- Начиная с:
- 1.4
- См. также:
DstAtop
public static final AlphaComposite DstAtop
AlphaComposite объект, реализующий непрозрачное правило DST_ATOP с альфа-значением 1.0f.- Начиная с:
- 1.4
- См. также:
Xor
public static final AlphaComposite Xor
AlphaComposite объект, реализующий непрозрачное правило XOR с альфа-значением 1.0f.- Начиная с:
- 1.4
- См. также:
Подробное описание методов
getInstance
public static AlphaComposite getInstance(int rule)
AlphaComposite с указанным правилом.getInstance
public static AlphaComposite getInstance(int rule, float alpha)
AlphaComposite с указанным правилом и постоянным альфа-значением, на которое умножается альфа-значение источника. Перед компоновкой с назначением источник умножается на указанное альфа-значение.- Параметры:
-
rule— правило компоновки -
alpha— постоянное альфа-значение, на которое умножается альфа-значение источника.alphaдолжно быть числом с плавающей точкой в диапазоне [0.0, 1.0] включительно. - Возвращает:
- созданный объект
AlphaComposite - Вызывает исключение:
-
IllegalArgumentException— еслиalphaменьше 0.0 или больше 1.0 либо еслиruleне является одним из следующих значений:CLEAR,SRC,DST,SRC_OVER,DST_OVER,SRC_IN,DST_IN,SRC_OUT,DST_OUT,SRC_ATOP,DST_ATOPилиXOR
createContext
public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints)
- Определено в:
-
createContextв интерфейсеComposite - Параметры:
-
srcColorModel—ColorModelисточника -
dstColorModel—ColorModelназначения -
hints— подсказка, которую объект контекста использует для выбора между вариантами отрисовки - Возвращает:
- объект
CompositeContext, предназначенный для выполнения операций компоновки.
getAlpha
public float getAlpha()
AlphaComposite. Если у этого объекта AlphaComposite нет альфа-значения, возвращается 1.0.- Возвращает:
- альфа-значение этого объекта
AlphaComposite.
getRule
public int getRule()
AlphaComposite.- Возвращает:
- правило компоновки этого объекта
AlphaComposite.
derive
public AlphaComposite derive(int rule)
AlphaComposite, использующий указанное правило компоновки. Если этот объект уже использует указанное правило компоновки, возвращается он сам.- Параметры:
-
rule— правило компоновки - Возвращает:
- объект
AlphaComposite, производный от этого объекта и использующий указанное правило компоновки. - Вызывает исключение:
-
IllegalArgumentException— еслиruleне является одним из следующих значений:CLEAR,SRC,DST,SRC_OVER,DST_OVER,SRC_IN,DST_IN,SRC_OUT,DST_OUT,SRC_ATOP,DST_ATOPилиXOR - Начиная с:
- 1.6
derive
public AlphaComposite derive(float alpha)
AlphaComposite, использующий указанное альфа-значение. Если у этого объекта уже указано такое альфа-значение, возвращается он сам.- Параметры:
-
alpha— постоянное альфа-значение, на которое умножается альфа-значение источника.alphaдолжно быть числом с плавающей точкой в диапазоне [0.0, 1.0] включительно. - Возвращает:
- объект
AlphaComposite, производный от этого объекта и использующий указанное альфа-значение. - Вызывает исключение:
-
IllegalArgumentException— еслиalphaменьше 0.0 или больше 1.0 - Начиная с:
- 1.6
hashCode
equals
public boolean equals(Object obj)
AlphaComposite. Результат равен true тогда и только тогда, когда аргумент не является null и представляет собой объект AlphaComposite с теми же правилом компоновки и альфа-значением, что и у этого объекта.
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.