合成是将两幅图像放在一起的动作,它使得我们能够同时看到两幅图像的特征。
在Android SDK中,可以通过首先在Canvas对象绘制一个位图对象,然后在相同的Canvas对象上绘制第二个位图对象的方式来实现合成。唯一的区别是在绘制第二幅图像时,需要在Paint对象上指定一个过渡模式(Xfermode)。
可用作过渡模式的类集合都继承自Xfermode基类,而且其中包括一个称为PorterDuff- Xfermode的类。PorterDuffXfermode类因Thomas Porter和Tom Duff而得名,他们于1984年在ACM SIGGRAPH计算机图形学出版物上发表了题为“Compositing digital images(合成数字图像)”的文章,详细介绍了一系列不同的规则,用于彼此重叠地绘制图像。这些规则定义了哪些图像的哪些部分将出现在结果输出中。
在Android的PorterDuff.Mode类中列举了Porter和Duff以及其他更多人制定的规则。
这些规则包括如下:
● android.graphics.PorterDuff.Mode.SRC:此规则意味着只绘制源图像,在当前情况下,它是正在应用此规则的Paint对象。
● android.graphics.PorterDuff.Mode.DST:此规则意味着只显示目标图像,即已在画布上的初始图像。
紧跟着SRC和DST规则,有一套与它们一起工作的规则,以确定最终将绘制每幅图像的哪些部分。这些规则通常适用于图像具有不同大小或它们存在透明部分时的情况。
● 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:将在源图像和目标图像重叠之外的任何地方绘制它们,而在它们重叠的地方不绘制任何内容。
另外4个规则定义了当一幅图像放置在另一幅图像之上时如何合成这两幅图像。
● android.graphics.PorterDuff.Mode.LIGHTEN:获得每个位置上两幅图像中最亮的像素并显示。
● android.graphics.PorterDuff.Mode.DARKEN:获得每个位置上两幅图像中最暗的像素并显示。
● android.graphics.PorterDuff.Mode.MULTIPLY:将每个位置的两个像素相乘,除以255,然后使用该值创建一个新的像素进行显示。结果颜色=顶部颜色×底部颜色/255。
● android.graphics.PorterDuff.Mode.SCREEN:反转每个颜色,执行相同的操作(将它们相乘并除以255),然后再次反转。结果颜色=255?(((255?顶部颜色)×(255?底部颜色))/255)
我们在示例应用程序中演示如何使用这些规则。