第一次翻译文章,不当之处请多指教。原文链接
类继承结构
public static final enum PorterDuff.Mode
extends Enum<PorterDuff.Mode>
java.lang.Object
↳ java.lang.Enum<android.graphics.PorterDuff.Mode>
↳ android.graphics.PorterDuff.Mode
Porter-Duff
Porter-Duff 这个类名是为了表达对 Thomas Porter 和 Tom Duff 的敬意,他们于 1984 年发表了一篇名为 “Compositing Digital Images”(合成数字图像)的开创性论文。在这篇文章中,两位作者描述了12种合成操作符,具体来说就是当我们把原图像绘制到目标图像处时应该如何计算二者结合后的颜色。
“Compositing Digital Images”(合成数字图像)于1984 年 7 月 发表在计算机图形期刊第18期,第3页。
由于 Porter 和 Duff 的工作只关注原图像和目标图像共同绘制对 alpha 通道(即我们所理解的透明度)的影响,所以我们又把在他们论文所提到的12种操作称为 alpha 合成模式。
方便起见,PorterDuff 类中也提供了混合模式,它们类似于alpha合成模式,只不过它们不仅仅是限制在 alpha 通道(RGB可能都有涉及)。Porter 和 Duff 的文章中并没有涉及到这些混合模式的操作,只不过是为了方便的目的我们才把这些操作包含进 PorterDuff 这个类中。
图像
下面所有的图像示例都是基于相同的原图像和目标图像
![]() |
![]() |
---|
下面代码展示了用于生成每个图像的绘制顺序:
Paint paint = new Paint();
canvas.drawBitmap(destinationImage, 0, 0, paint);
PorterDuff.Mode mode = // choose a mode
paint.setXfermode(new PorterDuffXfermode(mode));
canvas.drawBitmap(sourceImage, 0, 0, paint);
Alpha 合成模式
![]() |
![]() |
![]() |
![]() |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
混合模式
![]() |
![]() |
![]() |
---|---|---|
![]() |
![]() |
合成方程
以下每个单独的 alpha 合成或混合模式的文档提供了计算原图像和目标图像合成之后的 alpha 值和颜色值的精确方程。
alpha 的结果(输出值)记为![](https://img.haomeiwen.com/i5010454/d8553bd2e5e33f1f.png)
颜色的结果(输出值)记为
![](https://img.haomeiwen.com/i5010454/9cff47765fb577de.png)
概要
- PorterDuff.Mode
ADD
![](https://img.haomeiwen.com/i5010454/5d963b3be92da1be.png)
![](https://img.haomeiwen.com/i5010454/b87cb09140746760.png)
![](https://img.haomeiwen.com/i5010454/380a0f9c53aa080a.png)
-
PorterDuff.Mode
CLEAR
被源像素覆盖的目标像素被清除为0
-
PorterDuff.Mode
DARKEN
保留源像素、目标像素的较小值
-
PortDuff.Mode
DST
丢弃源像素,保留目标像素
-
PortDuff.Mode
DST_ATOP
丢弃未被源像素覆盖的目标像素
-
PortDuff.Mode
DST_IN
保留覆盖源像素的目标像素,丢弃剩余的源像素和目标像素
-
PortDuff.Mode
DST_OUT
保留未被源像素覆盖的目标像素
-
PortDuff.Mode
DST_OVER
源像素绘制在目标像素后面
-
PortDuff.Mode
LIGHTEN
保留源像素、目标像素的较小值
-
PortDuff.Mode
MULTIPLY
将源像素和目标像素进行Multiply(正片叠底)
-
PortDuff.Mode
OVERLAY
像素是进行 Multiply(正片叠底)混合还是 Screen(屏幕)混合,取决于目标颜色
-
PortDuff.Mode
SCREEN
将源像素和目标像素相加,然后减去乘以目标元素的源像素
-
PortDuff.Mode
SRC
只保留源像素
-
PortDuff.Mode
SRC_ATOP
丢弃未覆盖目标像素的源像素
-
PortDuff.Mode
SRC_IN
保持覆盖目标像素的源像素,丢弃剩余的源像素和目标像素
-
PortDuff.Mode
SRC_OUT
只保留不包含目标像素的源像素
-
PortDuff.Mode
SRC_OVER
源像素绘制在目标像素上
-
PortDuff.Mode
XOR
丢弃源像素覆盖目标像素的源像素和目标像素
CodeCogsEqn (35).png
总结
其实整篇下来,也没有几个英文单词,就是一直粘图。不过算是一个好的开始,因为工作中涉及到这方面的内容,算是巩固总结啦。顺便安利一下这篇个人觉得不错的文章各个击破搞明白PorterDuff.Mode
网友评论