Класс 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, а целое число 2n-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 |
Очищаются как цвет, так и альфа-канал назначения (правило Porter-Duff Clear). |
static final AlphaComposite |
Dst |
AlphaComposite объект, реализующий непрозрачное правило DST с альфой 1.0f. |
static final int |
DST |
Назначение остается без изменений (правило Porter-Duff Destination). |
static final int |
DST_ATOP |
Часть назначения, лежащая внутри источника, накладывается поверх источника и заменяет назначение (правило Porter-Duff Destination Atop Source). |
static final int |
DST_IN |
Часть назначения, лежащая внутри источника, заменяет назначение (правило Porter-Duff Destination In Source). |
static final int |
DST_OUT |
Часть назначения, лежащая вне источника, заменяет назначение (правило Porter-Duff Destination Held Out By Source). |
static final int |
DST_OVER |
Назначение накладывается поверх источника, и результат заменяет назначение (правило Porter-Duff 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 |
Источник копируется в назначение (правило Porter-Duff Source). |
static final int |
SRC_ATOP |
Часть источника, лежащая внутри назначения, накладывается на назначение (правило Porter-Duff Source Atop Destination). |
static final int |
SRC_IN |
Часть источника, лежащая внутри назначения, заменяет назначение (правило Porter-Duff Source In Destination). |
static final int |
SRC_OUT |
Часть источника, лежащая вне назначения, заменяет назначение (правило Porter-Duff Source Held Out By Destination). |
static final int |
SRC_OVER |
Источник накладывается поверх назначения (правило Porter-Duff 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 |
Часть источника, лежащая вне назначения, объединяется с частью назначения, лежащей вне источника (правило Porter-Duff 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() |
Возвращает хэш-код для данного композита. |
Подробное описание полей
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 с указанным правилом.- Параметры:
-
rule- правило композиции - Возвращает:
- созданный объект
AlphaComposite - Выбрасывает:
-
IllegalArgumentException- еслиruleне является одним из следующих:CLEAR,SRC,DST,SRC_OVER,DST_OVER,SRC_IN,DST_IN,SRC_OUT,DST_OUT,SRC_ATOP,DST_ATOPилиXOR
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
public int hashCode()
- Переопределяет:
-
hashCodeв классеObject - Возвращает:
- хэш-код этой композиции.
- См. также:
equals
public boolean equals(Object obj)
AlphaComposite. Результат равен true тогда и только тогда, когда аргумент не равен null и является объектом AlphaComposite с таким же правилом композиции и значением альфа-канала, что и этот объект.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
obj- объектObjectдля проверки на равенство - Возвращает:
-
trueеслиobjравен этомуAlphaComposite;falseв противном случае. - См. также:
© 1993, 2023, 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.
https://docs.oracle.com/en/java/javase/21/docs/api/java.desktop/java/awt/AlphaComposite.html