- すべての実装されたインタフェース:
Composite
AlphaComposite
クラスは、グラフィックスとイメージの混合や透明化の効果を実現するために、ソース色とデスティネーション色を組み合わせるための基本的なアルファ合成ルールを実装します。 このクラスで実装される特定のルールは、T. PorterおよびT. Duff共著の『Compositing Digital Images』(SIGGRAPH 84, 253 - 259)に記述されている一連の基本的な12の規則です。 このドキュメントでは、その著書で説明されている定義および概念について、ある程度の知識があることを前提としています。
このクラスは、PorterとDuffによって定義された標準の式を拡張し、係数を1つ追加しています。 AlphaComposite
クラスのインスタンスには、合成式で使用する前に、ソースのピクセルの透明度や範囲を変更できるアルファ値を格納できます。
PorterとDuffの著書で定義された式はすべて、対応するアルファ成分によってあらかじめ乗算された色成分を処理するように定義されています。 ColorModel
クラスおよびRaster
クラスでは、ピクセル・データをあらかじめ乗算された形式でも、乗算されていない形式でも保存できるため、式を適用する前に、すべての入力データをあらかじめ乗算された形式に正規化する必要があり、ピクセル値を格納する前に、すべての結果をデスティネーションによって要求された形式に調整して戻さなければならない可能性があります。
このクラスで定義するのは、純粋な数学的観念における色とアルファ値の合成の式だけです。 この式の正確な適用は、データをソースから取得し、デスティネーションに保存する方法によって異なります。 詳細は「実装の注意」を参照してください。
PorterとDuffの著書では、合成式の説明で次の係数が使われています。
要因 | 定義 |
---|---|
As | ソース・ピクセルのアルファ成分 |
Cs | あらかじめ乗算された形式でのソース・ピクセルの色成分 |
Ad | デスティネーション・ピクセルのアルファ成分 |
Cd | あらかじめ乗算された形式でのデスティネーション・ピクセルの色成分 |
Fs | ソース・ピクセルのうち、出力に関係する部分 |
Fd | デスティネーション・ピクセルのうち、出力に関係する部分 |
Ar | 結果として得られるアルファ成分 |
Cr | あらかじめ乗算された形式での結果の色成分 |
以上の係数を使用して、PorterとDuffは合成係数FsおよびFdを選択して、12種類の目的の視覚効果を生成する12とおりの方法を定義しています。 FsおよびFdを決定する式は、視覚効果を指定する12のstaticフィールドの記述で指定します。 たとえば、SRC_OVER
の記述では、Fs = 1およびFd =(1-As)を指定します。 合成係数を決定する一連の式がわかったら、それらを各ピクセルに適用し、次の一連の式を使用して、結果を生成できます。
Fs = f(Ad) Fd = f(As) Ar = As*Fs + Ad*Fd Cr = Cs*Fs + Cd*Fd
次の係数を使用して、PorterとDuffの著書の合成式の拡張を説明します。
要因 | 定義 |
---|---|
Csr | ソース・ピクセルのraw色成分の1つ |
Cdr | デスティネーション・ピクセルのraw色成分の1つ |
Aac | AlphaCompositeインスタンスの「特殊」アルファ成分 |
Asr | ソース・ピクセルのrawアルファ成分 |
Adr | デスティネーション・ピクセルのrawアルファ成分 |
Adf | デスティネーションに保存される最終アルファ成分 |
Cdf | デスティネーションに保存される最終raw色成分 |
入力の準備
AlphaComposite
クラスは、ソースのアルファに適用する追加のアルファ値を定義します。 この値は、AlphaComposite
のアルファによってrawソース・アルファとrawソース色の両方を乗算して指定されたアルファを持つピクセルに対して、最初に暗黙的なSRC_INルールをソース・ピクセルに適用しているかのように適用します。 これは、PorterとDuffの合成式で使用されるアルファを生成する次のような式になります。
As = Asr * Aacソースraw色成分はすべて
AlphaComposite
インスタンスのアルファで乗算する必要があります。 さらに、ソースがあらかじめ乗算された形式でない場合に、色成分をソース・アルファで乗算する必要があります。 そのためPorterとDuff式のソース色成分を生成する式は、ソース・ピクセルがあらかじめ乗算されているかどうかによって異なります。
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を標準PorterとDuff式で使用して、合成係数FsおよびFdを計算し、次に結果のあらかじめ乗算されている成分ArおよびCrを計算します。
結果の準備
結果は、あらかじめ乗算されていないデータを格納するデスティネーション・バッファに戻す場合にのみ、次の式を使用して調整する必要があります。
Adf = Ar Cdf = Cr (if dest is premultiplied) Cdf = Cr / Ar (if dest is not premultiplied)結果として得られるアルファがゼロの場合の除算は定義されていないため、その場合の除算は無視して「ゼロで除算」を避け、色成分はすべてゼロのままにしておきます。
パフォーマンス上の制約
パフォーマンス上の理由のため、AlphaComposite
クラスによって作成されるCompositeContext
オブジェクトのcompose
メソッドに渡すRaster
オブジェクトには、あらかじめ乗算されたデータを使用することをお薦めします。 ソースRaster
またはデスティネーションRaster
のどちらかがあらかじめ乗算されていない場合、合成処理の前後に適切な変換を行います。
実装の注意
-
BufferedImage
クラスに挙げられた不透明イメージの一部の種類など、ソースでピクセルのアルファ値を格納していない場合が多くあります。 そうしたソースにはすべてのピクセルに1.0のアルファを指定します。 - さらに、デスティネーションに、このクラスによって実行された合成計算の結果として得られるアルファ値を格納する場所がない場合も多くあります。 そのため、そうしたデスティネーションではこのクラスで生成される結果として得られるアルファ値が暗黙的に破棄されます。 そうしたデスティネーションでは、格納された色値をあらかじめ乗算されていないものとして扱い、色値を格納してアルファ値を破棄する前に、結果として得られるアルファ値によって結果の色値を除算する必要があります。
-
結果の精度は、デスティネーションのピクセルの保存方法によって異なります。 2、3から十数の一連の合成処理には少なくとも、デスティネーションとして、色およびアルファ成分あたり最低8ビットの領域を提供するイメージ形式が適切です。 成分あたりの領域が8ビット未満のイメージ形式では、結果の丸め誤差が目立たない1つまたは2つの合成処理にしか使用できません。 色成分を別に格納しないイメージ形式は、すべての種類の半透明合成に適していません。 たとえば、
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になり、これは8ビット格納形式での値0xffに等しくなります。)
あるいは、浮動小数点演算を使用する実装では、より正確な結果が得られ、丸め誤差がほとんどない場合でも元のピクセル値に戻ってしまうことがあります。 あるいは、整数値演算を使用する実装では、浮動小数点スペースで実行した場合に、式は色値の仮想NOPになるため、無修正のピクセルをデスティネーションに転送でき、すべての数値演算を避けることができます。
これらの実装はすべて同じ式に従おうとしますが、整数と小数点数値演算、および短縮した式と完全な式のさまざまなトレードオフが必要です。 そうした違いを相殺するため、あらかじめ乗算された結果の形式が実装とイメージ形式で一致していることのみを期待することがもっとも望ましいと考えられます。 この場合、あらかじめ乗算された形式で表された両方の答えが次に等しくなります。
(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
したがって、それらはすべて一致します。
- 式を単純化する技法によって計算の効率を上げるため、実装によっては、あらかじめ乗算されていないデスティネーションで、0.0の結果アルファ値が発見された場合に、実行方法を変更することがあります。 SRCルールでは、アルファによる除算を取り除くという単純化は、分母(アルファ)が0の場合に有効ではありません。 しかし、結果はあらかじめ乗算されている形式で見た場合にのみ正確であることを期待すべきであるため、結果として得られるアルファが0の場合は必然的に結果の色成分は関係なく、この場合の正確な動作は期待できません。
- 関連項目:
-
フィールドのサマリー
修飾子と型フィールド説明static final AlphaComposite
1.0fのアルファによる不透明のCLEARルールを実装するAlphaComposite
オブジェクト。static final int
デスティネーションの色およびアルファの両方がクリアされます(Porter-Duff Clearルール)。static final AlphaComposite
1.0fのアルファによる不透明のDSTルールを実装するAlphaComposite
オブジェクト。static final int
デスティネーションは変更されません(Porter-Duff Destinationルール)。static final int
デスティネーションのソース内部にある部分が、ソースに重ね合わせられ、この結果生成された色でデスティネーションが置き換えられます(Porter-Duff Destination Atop Sourceルール)。static final int
デスティネーションのソース内部にある部分でデスティネーションが置き換えられます(Porter-Duff Destination In Sourceルール)。static final int
デスティネーションのソース外部にある部分でデスティネーションが置き換えられます(Porter-Duff Destination Held Out By Sourceルール)。static final int
デスティネーションはソースの上に重ね合わせられ、この結果生成された色でデスティネーションが置き換えられます(Porter-Duff Destination Over Sourceルール)。static final AlphaComposite
1.0fのアルファによる不透明のDST_ATOPルールを実装するAlphaComposite
オブジェクト。static final AlphaComposite
1.0fのアルファによる不透明のDST_INルールを実装するAlphaComposite
オブジェクト。static final AlphaComposite
1.0fのアルファによる不透明のDST_OUTルールを実装するAlphaComposite
オブジェクト。static final AlphaComposite
1.0fのアルファによる不透明のDST_OVERルールを実装するAlphaComposite
オブジェクト。static final AlphaComposite
1.0fのアルファによる不透明のSRCルールを実装するAlphaComposite
オブジェクト。static final int
ソースがデスティネーションにコピーされます(Porter-Duff Sourceルール)。static final int
ソースのデスティネーション内部にある部分が、デスティネーションに重ね合わせられます(Porter-Duff Source Atop Destinationルール)。static final int
ソースのデスティネーション内部にある部分でデスティネーションが置き換えられます(Porter-Duff Source In Destinationルール)。static final int
ソースのデスティネーション外部にある部分でデスティネーションが置き換えられます(Porter-Duff Source Held Out By Destinationルール)。static final int
ソースはデスティネーションの上に重ね合わせられます(Porter-Duff Source Over Destinationルール)。static final AlphaComposite
1.0fのアルファによる不透明のSRC_ATOPルールを実装するAlphaComposite
オブジェクト。static final AlphaComposite
1.0fのアルファによる不透明のSRC_INルールを実装するAlphaComposite
オブジェクト。static final AlphaComposite
1.0fのアルファによる不透明のSRC_OUTルールを実装するAlphaComposite
オブジェクト。static final AlphaComposite
1.0fのアルファによる不透明のSRC_OVERルールを実装するAlphaComposite
オブジェクト。static final AlphaComposite
1.0fのアルファによる不透明のXORルールを実装するAlphaComposite
オブジェクト。static final int
ソースのデスティネーション外部にある部分が、デスティネーションのソース外部にある部分と混合されます(Porter-Duff Source Xor Destinationルール)。 -
メソッドのサマリー
修飾子と型メソッド説明createContext
(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) 合成操作のコンテキストを作成します。derive
(float alpha) 指定されたアルファ値を使用する類似のAlphaComposite
オブジェクトを返します。derive
(int rule) 指定された合成ルールを使用する類似のAlphaComposite
オブジェクトを返します。boolean
指定されたオブジェクトがこのAlphaComposite
に等しいかどうかを判定します。float
getAlpha()
このAlphaComposite
のアルファ値を返します。static AlphaComposite
getInstance
(int rule) 指定されたルールを使用してAlphaComposite
オブジェクトを作成します。static AlphaComposite
getInstance
(int rule, float alpha) 指定されたルールと、ソースのアルファに掛ける定数アルファを使用してAlphaComposite
オブジェクトを作成します。int
getRule()
このAlphaComposite
の合成ルールを返します。int
hashCode()
この合成のハッシュ・コードを返します。
-
フィールド詳細
-
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 Clear1.0fのアルファによる不透明のCLEARルールを実装するAlphaComposite
オブジェクト。- 関連項目:
-
Src
public static final AlphaComposite Src1.0fのアルファによる不透明のSRCルールを実装するAlphaComposite
オブジェクト。- 関連項目:
-
Dst
public static final AlphaComposite Dst1.0fのアルファによる不透明のDSTルールを実装するAlphaComposite
オブジェクト。- 導入されたバージョン:
- 1.4
- 関連項目:
-
SrcOver
public static final AlphaComposite SrcOver1.0fのアルファによる不透明のSRC_OVERルールを実装するAlphaComposite
オブジェクト。- 関連項目:
-
DstOver
public static final AlphaComposite DstOver1.0fのアルファによる不透明のDST_OVERルールを実装するAlphaComposite
オブジェクト。- 関連項目:
-
SrcIn
public static final AlphaComposite SrcIn1.0fのアルファによる不透明のSRC_INルールを実装するAlphaComposite
オブジェクト。- 関連項目:
-
DstIn
public static final AlphaComposite DstIn1.0fのアルファによる不透明のDST_INルールを実装するAlphaComposite
オブジェクト。- 関連項目:
-
SrcOut
public static final AlphaComposite SrcOut1.0fのアルファによる不透明のSRC_OUTルールを実装するAlphaComposite
オブジェクト。- 関連項目:
-
DstOut
public static final AlphaComposite DstOut1.0fのアルファによる不透明のDST_OUTルールを実装するAlphaComposite
オブジェクト。- 関連項目:
-
SrcAtop
public static final AlphaComposite SrcAtop1.0fのアルファによる不透明のSRC_ATOPルールを実装するAlphaComposite
オブジェクト。- 導入されたバージョン:
- 1.4
- 関連項目:
-
DstAtop
public static final AlphaComposite DstAtop1.0fのアルファによる不透明のDST_ATOPルールを実装するAlphaComposite
オブジェクト。- 導入されたバージョン:
- 1.4
- 関連項目:
-
Xor
public static final AlphaComposite Xor1.0fのアルファによる不透明のXORルールを実装するAlphaComposite
オブジェクト。- 導入されたバージョン:
- 1.4
- 関連項目:
-
-
メソッドの詳細
-
getInstance
public static AlphaComposite getInstance(int rule) 指定されたルールを使用してAlphaComposite
オブジェクトを作成します。 -
getInstance
public static AlphaComposite getInstance(int rule, float alpha) 指定されたルールと、ソースのアルファに掛ける定数アルファを使用してAlphaComposite
オブジェクトを作成します。 デスティネーションと合成される前に、ソースは指定されたアルファで乗算されます。 -
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
オブジェクトを返します。 指定された合成ルールがこのオブジェクトですでに使用されている場合は、このオブジェクトが返されます。 -
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()この合成のハッシュ・コードを返します。 -
equals
public boolean equals(Object obj) 指定されたオブジェクトがこのAlphaComposite
に等しいかどうかを判定します。引数が
null
でなく、このオブジェクトと同じ合成ルールおよびアルファ値を使用するAlphaComposite
オブジェクトである場合のみ、結果がtrue
になります。
-