Класс AlphaComposite
- Все реализуемые интерфейсы:
Composite
public final class AlphaComposite extends Object implements Composite
AlphaComposite реализует основные правила альфа-композиции для объединения исходных и целевых цветов, чтобы добиться эффектов смешивания и прозрачности с графикой и изображениями. Конкретные правила, реализованные этим классом, представляют собой базовый набор из 12 правил, описанных в статье Т. Портера и Т. Даффа "Композиция цифровых изображений" (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 |
Оба цвета и альфа значения назначения очищаются (правило 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
- Since:
- 1.4
- См. также:
Xor
public static final AlphaComposite Xor
- Since:
- 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 - Since:
- 1.6
derive
public AlphaComposite derive(float alpha)
AlphaComposite, использующий указанное значение альфы. Если у этого объекта уже есть указанное значение альфы, возвращается этот объект.- Параметры:
-
alpha- константа альфа, умножаемая на альфу источника.alphaдолжна быть числом с плавающей точкой в диапазоне [0.0, 1.0] включительно. - Возвращает:
- объект
AlphaComposite, полученный из этого объекта, использующий указанное значение альфы. - Исключения:
-
IllegalArgumentException- еслиalphaменьше 0.0 или больше 1.0 - Since:
- 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.
https://download.java.net/java/early_access/jdk24/docs/api/java.desktop/java/awt/AlphaComposite.html