Класс 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- правило композиции - Исключения:
-
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 включительно. - Исключения:
-
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.