合成是將兩幅圖像放在一起的動作,它使得我們能夠同時看到兩幅圖像的特征。
在Android SDK中,可以通過首先在Canvas對象繪制一個位圖對象,然后在相同的Canvas對象上繪制第二個位圖對象的方式來實現(xiàn)合成。唯一的區(qū)別是在繪制第二幅圖像時,需要在Paint對象上指定一個過渡模式(Xfermode)。
可用作過渡模式的類集合都繼承自Xfermode基類,而且其中包括一個稱為PorterDuff- Xfermode的類。PorterDuffXfermode類因Thomas Porter和Tom Duff而得名,他們于1984年在ACM SIGGRAPH計算機圖形學出版物上發(fā)表了題為“Compositing digital images(合成數(shù)字圖像)”的文章,詳細介紹了一系列不同的規(guī)則,用于彼此重疊地繪制圖像。這些規(guī)則定義了哪些圖像的哪些部分將出現(xiàn)在結果輸出中。
在Android的PorterDuff.Mode類中列舉了Porter和Duff以及其他更多人制定的規(guī)則。
這些規(guī)則包括如下:
● android.graphics.PorterDuff.Mode.SRC:此規(guī)則意味著只繪制源圖像,在當前情況下,它是正在應用此規(guī)則的Paint對象。
● android.graphics.PorterDuff.Mode.DST:此規(guī)則意味著只顯示目標圖像,即已在畫布上的初始圖像。
緊跟著SRC和DST規(guī)則,有一套與它們一起工作的規(guī)則,以確定最終將繪制每幅圖像的哪些部分。這些規(guī)則通常適用于圖像具有不同大小或它們存在透明部分時的情況。
● android.graphics.PorterDuff.Mode.DST_OVER:將在源圖像的頂部繪制目標圖像。
● android.graphics.PorterDuff.Mode.DST_IN:將僅僅在源圖像和目標圖像相交的地方繪制目標圖像。
● android.graphics.PorterDuff.Mode.DST_OUT:將僅僅在源圖像和目標圖像不相交的地方繪制目標圖像。
● android.graphics.PorterDuff.Mode.DST_ATOP:將在目標圖像與源圖像相交的地方繪制目標圖像;在其他地方繪制源圖像。
● android.graphics.PorterDuff.Mode.SRC_OVER:將在目標圖像的頂部繪制源圖像。
● android.graphics.PorterDuff.Mode.SRC_IN:將僅僅在目標圖像和源圖像相交的地方繪制源圖像。
● android.graphics.PorterDuff.Mode.SRC_OUT:將僅僅在目標圖像和源圖像不相交的地方繪制源圖像。
● android.graphics.PorterDuff.Mode.SRC_ATOP:將在源圖像與目標圖像相交的地方繪制源圖像;在其他地方繪制目標圖像。
● android.graphics.PorterDuff.Mode.XOR:將在源圖像和目標圖像重疊之外的任何地方繪制它們,而在它們重疊的地方不繪制任何內(nèi)容。
另外4個規(guī)則定義了當一幅圖像放置在另一幅圖像之上時如何合成這兩幅圖像。
● android.graphics.PorterDuff.Mode.LIGHTEN:獲得每個位置上兩幅圖像中最亮的像素并顯示。
● android.graphics.PorterDuff.Mode.DARKEN:獲得每個位置上兩幅圖像中最暗的像素并顯示。
● android.graphics.PorterDuff.Mode.MULTIPLY:將每個位置的兩個像素相乘,除以255,然后使用該值創(chuàng)建一個新的像素進行顯示。結果顏色=頂部顏色×底部顏色/255。
● android.graphics.PorterDuff.Mode.SCREEN:反轉每個顏色,執(zhí)行相同的操作(將它們相乘并除以255),然后再次反轉。結果顏色=255?(((255?頂部顏色)×(255?底部顏色))/255)
我們在示例應用程序中演示如何使用這些規(guī)則。