Класс 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() |
Возвращает хеш-код этого объекта композиции. |
Подробное описание полей
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)
- См. также:
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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.desktop/java/awt/AlphaComposite.html