Класс 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, а целое число 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, 2021, 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/17/docs/api/java.desktop/java/awt/AlphaComposite.html