|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.awt.AlphaComposite
public final class AlphaComposite
AlphaComposite
類別實作一些基本的 alpha 合成規則,將源色與目標色組合,在圖形和圖像中實作混合和透明效果。此類別實作的特定規則是 T. Porter 和 T. Duff 合著的 "Compositing Digital Images", SIGGRAPH 84, 253-259 中描述的 12 條基本規則集。本文檔的其餘部分假定讀者熟悉上述論文中概括的定義和概念。
此類別擴展了 Porter 和 Duff 定義的方程,包含一個額外的因子。AlphaComposite
類別的實例可以包含一個 alpha 值,在將該值用於混合方程之前,可以用它來修改不透明度和每個源像素的覆寫率。
要重點注意的是,Porter 和 Duff 的論文中定義的方程完全是為顏色份量方面的操作定義的,這些顏色份量都要用它們對應的 alpha 份量預乘。因為 ColorModel
和 Raster
類別允許以預乘和非預乘的方式存儲像素資料,所以在將所有輸入資料應用到方程之前,必須將它們標準化為預乘形式,並且在存儲像素值之前,可能需要將所有結果都調整回目標所需的形式。
還要注意的是,此類別只定義了以純數學方式組合顏色和 alpha 值的方程。方程的具體應用取決於從資料源中檢索資料和將它們存儲到其目標中的方式。有關更多資訊,請參閱實作警告事項。
Porter 和 Duff 的論文在混合方程的描述中使用了以下因子:
因子 定義 As 源像素的 alpha 份量 Cs 源像素的預乘形式的顏色份量 Ad 目標像素的 alpha 份量 Cd 目標像素的預乘形式的顏色份量 Fs 用於輸出的源像素的分數值 Fd 用於輸出的目標像素的分數值 Ar 結果 alpha 份量 Cr 結果預乘形式的顏色份量
使用這些因子,Porter 和 Duff 定義了 12 種選擇混合因子 Fs 和 Fd 的方法,從而產生了 12 種令人滿意的可視效果。在對 12 個指定可視效果的靜態欄位的描述中,給出了具有確定 Fs 和 Fd 值的方程。例如,對 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 源像素的原始顏色份量之一 Cdr 目標像素的原始顏色份量之一 Aac 取自 AlphaComposite 實例的“額外的”alpha 份量 Asr 源像素的原始 alpha 份量 Adr 目標像素的原始 alpha 份量 Adf 目標中存儲的最終 alpha 份量 Cdf 目標中存儲的最終原始顏色份量
AlphaComposite
類別定義一個應用於源 alpha 的額外 alpha 值。應用此值就好像首先將隱式的 SRC_IN 規則應用於源像素(通過將原始源 alpha 和原始源色乘以 AlphaComposite
中的 alpha 值獲得),而不是應用於具有指定 alpha 值的像素。這產生了以下方程,該方程產生 Porter 和 Duff 的混合方程中使用的 alpha 值:
As = Asr * Aac所有這些原始源色份量都必須乘以
AlphaComposite
實例中的 alpha 值。此外,如果源色份量不是預乘形式的,那麼還需要將顏色份量乘以源 alpha 值。因此,用來產生 Porter 和 Duff 方程源色份量的方程取決於源像素是否已經被預乘:
Cs = Csr * Asr * Aac (如果源像素沒有被預乘) Cs = Csr * Aac (如果源像素被預乘)無需對目標 alpha 進行調整:
Ad = Adr
僅當目標色份量不是預乘形式時,才需要對它們進行調整:
Cd = Cdr * Ad (如果目標色份量沒有被預乘) Cd = Cdr (如果目標色份量被預乘)
調整後的 As、Ad、Cs 和 Cd 將用於標準的 Porter 和 Duff 方程,以計算混合因子 Fs 和 Fd,然後計算得到的預乘份量 Ar 和 Cr。
僅當結果要存儲回保存未預乘資料的目標緩衝區時,才需要使用以下方程調整結果:
Adf = Ar Cdf = Cr (如果目標資料被預乘) Cdf = Cr / Ar (如果目標資料沒有被預乘)注意,在所得 alpha 為零時除法是不明確的,所以在這種情況下會忽略除法以避免“除以零”的情況,此時顏色份量都將為零。
出於性能方面的原因,傳遞給 CompositeContext
物件(由 AlphaComposite
類別創建) compose
方法的 Raster
物件最好有預乘資料。不過,如果源 Raster
或目標 Raster
沒有被預乘,那麼可以在合成操作之前或之後執行適當的轉換。
BufferedImage
類別中列出的一些不透明圖像型別,沒有為它們的像素存儲 alpha 值。這類別源圖像為它們所有的像素提供了值為 1.0 的 alpha 值。
BufferedImage.TYPE_BYTE_INDEXED
用作混合操作的目標,因為需要從限定的調色板選擇像素,以比對混合方程的結果,所以每個操作都可能引入大量錯誤。
通常,整數值與浮點值存在某種相關性:整數 0 等於浮點值 0.0,整數 2^n-1(其中 n 是表示形式中的位數)等於 1.0。對於 8 位的表示形式,這意味著 0x00 表示 0.0,0xff 表示 1.0。
(A, R, G, B) = (0x01, 0xb0, 0x00, 0x00)
如果正在使用整數運算,並且此值在 SRC
網要下沒有與任何 alpha 值合成,則該運算將指示此運算的結果為(整數格式):
(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
注意中間的值,它總是以已預乘的形式出現,並且只允許整數 red 份量為 0x00 或 0x01。當試圖將此結果存儲回未預乘的目標中時,用 alpha 值相除之後,對於未預乘的 red 值,可進行的選擇很少。在這種情況下,在整數空間內執行運算(沒有快捷方式)的實作最後可能提供以下最終像素值:
(A, R, G, B) = (0x01, 0xff, 0x00, 0x00)
(注意,0x01 除以 0x01 得到的是 1.0,等於 8 位存儲格式的值 0xff。)
另一方面,使用浮點運算的實作可以產生更精確的結果,並以返回原始像素值結束,該值有可能帶有少量的捨入誤差。或者,使用整數運算的實作可能決定是否可以將未涉及的像素傳輸給目標,完全避免所有運算。因為如果在浮點空間內執行運算,方程可簡單歸結為顏色值上的一個虛擬 NOP。
這些實作都試圖遵守相同的方程,但使用經過權衡的不同整數和浮點運算,並使用部分的或全部的方程。為了說明這些不同之處,可能最好只期望獲得已預乘形式的結果,以在實作和圖像格式之間進行比對。在這種情況下,以預乘形式表示的兩種答案將等同於:
(A, R, G, B) = (0x01, 0x01, 0x00, 0x00)
並且它們將是完全比對的。
Composite
,
CompositeContext
欄位摘要 | |
---|---|
static AlphaComposite |
Clear
實作不透明 CLEAR 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static int |
CLEAR
目標色和目標 alpha 值都被清除(Porter-Duff Clear 規則)。 |
static AlphaComposite |
Dst
實作不透明 DST 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
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
實作不透明 DST_ATOP 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
DstIn
實作不透明 DST_IN 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
DstOut
實作不透明 DST_OUT 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
DstOver
實作不透明 DST_OVER 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
Src
實作不透明 SRC 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
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
實作不透明 SRC_ATOP 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
SrcIn
實作不透明 SRC_IN 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
SrcOut
實作不透明 SRC_OUT 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
SrcOver
實作不透明 SRC_OVER 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static AlphaComposite |
Xor
實作不透明 XOR 規則的 AlphaComposite 物件,具有 1.0f 的 alpha 值。 |
static int |
XOR
將目標色之外的源色部分與源色之外的目標色部分結合到一起(Porter-Duff Source Xor Destination 規則)。 |
方法摘要 | |
---|---|
CompositeContext |
createContext(ColorModel srcColorModel,
ColorModel dstColorModel,
RenderingHints hints)
為合成操作創建一個上下文。 |
AlphaComposite |
derive(float alpha)
返回一個類似的 AlphaComposite 物件,該物件使用指定的 alpha 值。 |
AlphaComposite |
derive(int rule)
返回一個類似的 AlphaComposite 物件,該物件使用指定的復合規則。 |
boolean |
equals(Object obj)
確定指定的物件是否等於此 AlphaComposite 。 |
float |
getAlpha()
返回此 AlphaComposite 的 alpha 值。 |
static AlphaComposite |
getInstance(int rule)
創建一個具有指定規則的 AlphaComposite 物件。 |
static AlphaComposite |
getInstance(int rule,
float alpha)
創建一個 AlphaComposite 物件,它具有指定的規則和用來乘源色 alpha 值的常數 alpha 值。 |
int |
getRule()
返回此 AlphaComposite 的合成規則。 |
int |
hashCode()
返回此合成的雜湊碼。 |
從類別 java.lang.Object 繼承的方法 |
---|
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait |
欄位詳細資訊 |
---|
public static final int CLEAR
Fs = 0 和 Fd = 0,因此:
Ar = 0 Cr = 0
public static final int SRC
Fs = 1 和 Fd = 0,因此:
Ar = As Cr = Cs
public static final int DST
Fs = 0 和 Fd = 1,因此:
Ar = Ad Cr = Cd
public static final int SRC_OVER
Fs = 1 和 Fd = (1-As),因此:
Ar = As + Ad*(1-As) Cr = Cs + Cd*(1-As)
public static final int DST_OVER
Fs = (1-Ad) 和 Fd = 1,因此:
Ar = As*(1-Ad) + Ad Cr = Cs*(1-Ad) + Cd
public static final int SRC_IN
Fs = Ad 和 Fd = 0,因此:
Ar = As*Ad Cr = Cs*Ad
public static final int DST_IN
Fs = 0 和 Fd = As,因此:
Ar = Ad*As Cr = Cd*As
public static final int SRC_OUT
Fs = (1-Ad) 和 Fd = 0,因此:
Ar = As*(1-Ad) Cr = Cs*(1-Ad)
public static final int DST_OUT
Fs = 0 和 Fd = (1-As),因此:
Ar = Ad*(1-As) Cr = Cd*(1-As)
public static final int SRC_ATOP
Fs = Ad 和 Fd = (1-As),因此:
Ar = As*Ad + Ad*(1-As) = Ad Cr = Cs*Ad + Cd*(1-As)
public static final int DST_ATOP
Fs = (1-Ad) 和 Fd = As,因此:
Ar = As*(1-Ad) + Ad*As = As Cr = Cs*(1-Ad) + Cd*As
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)
public static final AlphaComposite Clear
AlphaComposite
物件,具有 1.0f 的 alpha 值。
CLEAR
public static final AlphaComposite Src
AlphaComposite
物件,具有 1.0f 的 alpha 值。
SRC
public static final AlphaComposite Dst
AlphaComposite
物件,具有 1.0f 的 alpha 值。
DST
public static final AlphaComposite SrcOver
AlphaComposite
物件,具有 1.0f 的 alpha 值。
SRC_OVER
public static final AlphaComposite DstOver
AlphaComposite
物件,具有 1.0f 的 alpha 值。
DST_OVER
public static final AlphaComposite SrcIn
AlphaComposite
物件,具有 1.0f 的 alpha 值。
SRC_IN
public static final AlphaComposite DstIn
AlphaComposite
物件,具有 1.0f 的 alpha 值。
DST_IN
public static final AlphaComposite SrcOut
AlphaComposite
物件,具有 1.0f 的 alpha 值。
SRC_OUT
public static final AlphaComposite DstOut
AlphaComposite
物件,具有 1.0f 的 alpha 值。
DST_OUT
public static final AlphaComposite SrcAtop
AlphaComposite
物件,具有 1.0f 的 alpha 值。
SRC_ATOP
public static final AlphaComposite DstAtop
AlphaComposite
物件,具有 1.0f 的 alpha 值。
DST_ATOP
public static final AlphaComposite Xor
AlphaComposite
物件,具有 1.0f 的 alpha 值。
XOR
方法詳細資訊 |
---|
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
public static AlphaComposite getInstance(int rule, float alpha)
AlphaComposite
物件,它具有指定的規則和用來乘源色 alpha 值的常數 alpha 值。在將源色與目標色合成前,要將源色乘以指定的 alpha 值。
rule
- 合成規則alpha
- 將乘源色的 alpha 值的常數 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
public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints)
Composite
中的 createContext
srcColorModel
- 源色的 ColorModel
dstColorModel
- 目標色的 ColorModel
hints
- 上下文物件用於選擇呈現方法的提示
CompositeContext
物件。public float getAlpha()
AlphaComposite
的 alpha 值。如果此 AlphaComposite
沒有 alpha 值,則返回 1.0。
AlphaComposite
的 alpha 值。public int getRule()
AlphaComposite
的合成規則。
AlphaComposite
的合成規則。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
public AlphaComposite derive(float alpha)
AlphaComposite
物件,該物件使用指定的 alpha 值。如果此物件已經具有指定的 alpha 值,則返回此物件。
alpha
- 常數 alpha,將乘以源的 alpha 值。alpha
必須是閉區間 [0.0, 1.0] 中的一個浮點數字。
AlphaComposite
物件。
IllegalArgumentException
- 如果 alpha
小於 0.0 或大於 1.0public int hashCode()
Object
中的 hashCode
Object.equals(java.lang.Object)
,
Hashtable
public boolean equals(Object obj)
AlphaComposite
。
當且僅當參數不為 null
,並且是一個與此物件具有相同組合規則和 alpha 值的 AlphaComposite
物件時,結果才為 true
。
Object
中的 equals
obj
- 要測試相等性的 Object
obj
等於此 AlphaComposite
,則返回 true
;否則返回 false
。Object.hashCode()
,
Hashtable
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。