Класс AlphaComposite
- java.lang.Object
-
- java.awt.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 по существу делает результаты цветовые компоненты нерелевантными, и поэтому точного поведения в этом случае не следует ожидать.
- См. также:
-
Composite,CompositeContext
Поля
| Модификатор и Тип | Поле | Описание |
|---|---|---|
static AlphaComposite | Clear |
|
static int | CLEAR | И цвет, и альфа-канал места назначения очищаются (правило Porter-Duff Clear). |
static AlphaComposite | Dst |
|
static int | DST | Место назначения остается без изменений (правило Porter-Duff Destination). |
static int | DST_ATOP | Часть места назначения, находящаяся внутри источника, накладывается поверх источника и заменяет место назначения (правило Porter-Duff Destination Atop Source). |
static int | DST_IN | Часть места назначения, находящаяся внутри источника, заменяет место назначения (правило Porter-Duff Destination In Source). |
static int | DST_OUT | Часть места назначения, находящаяся вне источника, заменяет место назначения (правило Porter-Duff Destination Held Out By Source). |
static int | DST_OVER | Место назначения накладывается поверх источника, а результат заменяет место назначения (правило Porter-Duff Destination Over Source). |
static AlphaComposite | DstAtop |
|
static AlphaComposite | DstIn |
|
static AlphaComposite | DstOut |
|
static AlphaComposite | DstOver |
|
static AlphaComposite | Src |
|
static int | SRC | Источник копируется в место назначения (правило Porter-Duff Source). |
static int | SRC_ATOP | Часть источника, находящаяся внутри места назначения, накладывается на место назначения (правило Porter-Duff Source Atop Destination). |
static int | SRC_IN | Часть источника, находящаяся внутри места назначения, заменяет место назначения (правило Porter-Duff Source In Destination). |
static int | SRC_OUT | Часть источника, находящаяся вне места назначения, заменяет место назначения (правило Porter-Duff Source Held Out By Destination). |
static int | SRC_OVER | Источник накладывается поверх места назначения (правило Porter-Duff Source Over Destination). |
static AlphaComposite | SrcAtop |
|
static AlphaComposite | SrcIn |
|
static AlphaComposite | SrcOut |
|
static AlphaComposite | SrcOver |
|
static AlphaComposite | Xor |
|
static int | XOR | Часть источника, находящаяся вне места назначения, объединяется с частью места назначения, находящейся вне источника (правило Porter-Duff Source Xor Destination). |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
CompositeContext | createContext(ColorModel srcColorModel,
ColorModel dstColorModel,
RenderingHints hints) | Создаёт контекст для операции композиции. |
AlphaComposite | derive(float alpha) | Возвращает похожий объект |
AlphaComposite | derive(int rule) | Возвращает похожий объект |
boolean | equals(Object obj) | Определяет, равен ли указанный объект этому объекту |
float | getAlpha() | Возвращает значение альфа этого объекта |
static AlphaComposite | getInstance(int rule) | Создаёт объект |
static AlphaComposite | getInstance(int rule,
float alpha) | Создаёт объект |
int | getRule() | Возвращает правило композиции этого объекта |
int | hashCode() | Возвращает хэш-код для этого составного объекта. |
Методы, объявленные в классе java.lang.Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait Поля
CLEAR
@Native public static final int CLEAR
Цвет и альфа значения назначения обнуляются (правило Porter-Duff Clear). Ни источник, ни назначение не используются как входные данные.
Fs = 0 и Fd = 0, таким образом:
Ar = 0 Cr = 0
- См. также:
- Значения константных полей
SRC
@Native public static final int SRC
Источник копируется в назначение (правило Porter-Duff Source). Назначение не используется как входные данные.
Fs = 1 и Fd = 0, таким образом:
Ar = As Cr = Cs
- См. также:
- Значения константных полей
DST
@Native public static final int DST
Назначение остается неизменным (правило Porter-Duff Destination).
Fs = 0 и Fd = 1, таким образом:
Ar = Ad Cr = Cd
- С:
- 1.4
- См. также:
- Значения константных полей
SRC_OVER
@Native public static final int SRC_OVER
Источник накладывается поверх назначения (правило Porter-Duff Source Over Destination).
Fs = 1 и Fd = (1-As), таким образом:
Ar = As + Ad*(1-As) Cr = Cs + Cd*(1-As)
- См. также:
- Значения константных полей
DST_OVER
@Native public static final int DST_OVER
Назначение накладывается поверх источника, и результат заменяет назначение (правило Porter-Duff Destination Over Source).
Fs = (1-Ad) и Fd = 1, таким образом:
Ar = As*(1-Ad) + Ad Cr = Cs*(1-Ad) + Cd
- См. также:
- Значения константных полей
SRC_IN
@Native public static final int SRC_IN
Часть источника, находящаяся внутри назначения, заменяет назначение (правило Porter-Duff Source In Destination).
Fs = Ad и Fd = 0, таким образом:
Ar = As*Ad Cr = Cs*Ad
- См. также:
- Значения константных полей
DST_IN
@Native public static final int DST_IN
Часть назначения, находящаяся внутри источника, заменяет назначение (правило Porter-Duff Destination In Source).
Fs = 0 и Fd = As, таким образом:
Ar = Ad*As Cr = Cd*As
- См. также:
- Значения константных полей
SRC_OUT
@Native public static final int SRC_OUT
Часть источника, находящаяся вне назначения, заменяет назначение (правило Porter-Duff Source Held Out By Destination).
Fs = (1-Ad) и Fd = 0, таким образом:
Ar = As*(1-Ad) Cr = Cs*(1-Ad)
- См. также:
- Значения константных полей
DST_OUT
@Native public static final int DST_OUT
Часть назначения, находящаяся вне источника, заменяет назначение (правило Porter-Duff Destination Held Out By Source).
Fs = 0 и Fd = (1-As), таким образом:
Ar = Ad*(1-As) Cr = Cd*(1-As)
- См. также:
- Значения константных полей
SRC_ATOP
@Native public static final int SRC_ATOP
Часть источника, находящаяся внутри назначения, накладывается на назначение (правило Porter-Duff Source Atop Destination).
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
Часть назначения, находящаяся внутри источника, накладывается поверх источника и заменяет назначение (правило Porter-Duff Destination Atop Source).
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
Часть источника, находящаяся вне назначения, комбинируется с частью назначения, находящейся вне источника (правило Porter-Duff Source Xor Destination).
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.
- См. также:
CLEAR
Src
public static final AlphaComposite Src
Объект AlphaComposite, реализующий непрозрачное правило SRC с альфой 1.0f.
- См. также:
SRC
Dst
public static final AlphaComposite Dst
Объект AlphaComposite, реализующий непрозрачное правило DST с альфой 1.0f.
- С:
- 1.4
- См. также:
DST
SrcOver
public static final AlphaComposite SrcOver
Объект AlphaComposite, реализующий непрозрачное правило SRC_OVER с альфой 1.0f.
- См. также:
SRC_OVER
DstOver
public static final AlphaComposite DstOver
Объект AlphaComposite, реализующий непрозрачное правило DST_OVER с альфой 1.0f.
- См. также:
DST_OVER
SrcIn
public static final AlphaComposite SrcIn
Объект AlphaComposite, реализующий непрозрачное правило SRC_IN с альфой 1.0f.
- См. также:
SRC_IN
DstIn
public static final AlphaComposite DstIn
Объект AlphaComposite, реализующий непрозрачное правило DST_IN с альфой 1.0f.
- См. также:
DST_IN
SrcOut
public static final AlphaComposite SrcOut
Объект AlphaComposite, реализующий непрозрачное правило SRC_OUT с альфой 1.0f.
- См. также:
SRC_OUT
DstOut
public static final AlphaComposite DstOut
Объект AlphaComposite, реализующий непрозрачное правило DST_OUT с альфой 1.0f.
- См. также:
DST_OUT
SrcAtop
public static final AlphaComposite SrcAtop
Объект AlphaComposite, реализующий непрозрачное правило SRC_ATOP с альфой 1.0f.
- С:
- 1.4
- См. также:
SRC_ATOP
DstAtop
public static final AlphaComposite DstAtop
Объект AlphaComposite, реализующий непрозрачное правило DST_ATOP с альфой 1.0f.
- С:
- 1.4
- См. также:
DST_ATOP
Xor
public static final AlphaComposite Xor
Объект AlphaComposite, реализующий непрозрачное правило XOR с альфой 1.0f.
- С:
- 1.4
- См. также:
XOR
Методы
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 - Возвращает:
- хэш-код для этой композиции.
- См. также:
-
Object.equals(java.lang.Object),System.identityHashCode(java.lang.Object)
equals
public boolean equals(Object obj)
Определяет, равен ли указанный объект этому объекту AlphaComposite.
Результат равен true тогда и только тогда, когда аргумент не равен null и является объектом AlphaComposite с тем же правилом композиции и значением альфа, что и этот объект.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
obj- объектObjectдля проверки на равенство - Возвращает:
-
trueеслиobjравен этомуAlphaComposite;falseв противном случае. - См. также:
-
Object.hashCode(),HashMap
© 1993, 2020, 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/11/docs/api/java.desktop/java/awt/AlphaComposite.html