(译)PorterDuff.Mode

第一次翻译文章,不当之处请多指教。原文链接

类继承结构

public static final enum PorterDuff.Mode
        extends Enum
java.lang.Object
   ↳    java.lang.Enum
   ↳    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 这个类中。

图像

下面所有的图像示例都是基于相同的原图像和目标图像

(译)PorterDuff.Mode_第1张图片
Source image.png
(译)PorterDuff.Mode_第2张图片
Destination image.png

下面代码展示了用于生成每个图像的绘制顺序:

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 合成模式

(译)PorterDuff.Mode_第3张图片
Source.png
(译)PorterDuff.Mode_第4张图片
Source Over.png
(译)PorterDuff.Mode_第5张图片
Source In.png
(译)PorterDuff.Mode_第6张图片
Source Atop.png
(译)PorterDuff.Mode_第7张图片
Destination.png
(译)PorterDuff.Mode_第8张图片
Destination Over.png
(译)PorterDuff.Mode_第9张图片
Destination In.png
(译)PorterDuff.Mode_第10张图片
Destination Atop.png
(译)PorterDuff.Mode_第11张图片
Clear.png
(译)PorterDuff.Mode_第12张图片
Source Out.png
(译)PorterDuff.Mode_第13张图片
Destination Out.png
(译)PorterDuff.Mode_第14张图片
Exclusive Or.png

混合模式

(译)PorterDuff.Mode_第15张图片
Darken.png
(译)PorterDuff.Mode_第16张图片
Lighten.png
(译)PorterDuff.Mode_第17张图片
Multiply.png
(译)PorterDuff.Mode_第18张图片
Screen.png
(译)PorterDuff.Mode_第19张图片
Overlay.png

合成方程

以下每个单独的 alpha 合成或混合模式的文档提供了计算原图像和目标图像合成之后的 alpha 值和颜色值的精确方程。

alpha 的结果(输出值)记为

颜色的结果(输出值)记为

概要

  • PorterDuff.Mode
    ADD
(译)PorterDuff.Mode_第20张图片
将源像素添加到目标像素并使饱和度叠加
  • PorterDuff.Mode
    CLEAR


    (译)PorterDuff.Mode_第21张图片
    被源像素覆盖的目标像素被清除为0
  • PorterDuff.Mode
    DARKEN


    (译)PorterDuff.Mode_第22张图片
    保留源像素、目标像素的较小值
  • PortDuff.Mode
    DST


    (译)PorterDuff.Mode_第23张图片
    丢弃源像素,保留目标像素
  • PortDuff.Mode
    DST_ATOP


    (译)PorterDuff.Mode_第24张图片
    丢弃未被源像素覆盖的目标像素
  • PortDuff.Mode
    DST_IN


    (译)PorterDuff.Mode_第25张图片
    保留覆盖源像素的目标像素,丢弃剩余的源像素和目标像素
  • PortDuff.Mode
    DST_OUT


    (译)PorterDuff.Mode_第26张图片
    保留未被源像素覆盖的目标像素
  • PortDuff.Mode
    DST_OVER


    (译)PorterDuff.Mode_第27张图片
    源像素绘制在目标像素后面
  • PortDuff.Mode
    LIGHTEN


    (译)PorterDuff.Mode_第28张图片
    保留源像素、目标像素的较小值
  • PortDuff.Mode
    MULTIPLY


    (译)PorterDuff.Mode_第29张图片
    将源像素和目标像素进行Multiply(正片叠底)
  • PortDuff.Mode
    OVERLAY


    (译)PorterDuff.Mode_第30张图片
    像素是进行 Multiply(正片叠底)混合还是 Screen(屏幕)混合,取决于目标颜色
    (译)PorterDuff.Mode_第31张图片
  • PortDuff.Mode
    SCREEN


    (译)PorterDuff.Mode_第32张图片
    将源像素和目标像素相加,然后减去乘以目标元素的源像素
  • PortDuff.Mode
    SRC


    (译)PorterDuff.Mode_第33张图片
    只保留源像素
  • PortDuff.Mode
    SRC_ATOP


    (译)PorterDuff.Mode_第34张图片
    丢弃未覆盖目标像素的源像素
  • PortDuff.Mode
    SRC_IN


    (译)PorterDuff.Mode_第35张图片
    保持覆盖目标像素的源像素,丢弃剩余的源像素和目标像素
  • PortDuff.Mode
    SRC_OUT


    (译)PorterDuff.Mode_第36张图片
    只保留不包含目标像素的源像素
  • PortDuff.Mode
    SRC_OVER


    (译)PorterDuff.Mode_第37张图片
    源像素绘制在目标像素上
  • PortDuff.Mode
    XOR


    (译)PorterDuff.Mode_第38张图片
    丢弃源像素覆盖目标像素的源像素和目标像素
    CodeCogsEqn (35).png

总结

其实整篇下来,也没有几个英文单词,就是一直粘图。不过算是一个好的开始,因为工作中涉及到这方面的内容,算是巩固总结啦。顺便安利一下这篇个人觉得不错的文章各个击破搞明白PorterDuff.Mode

你可能感兴趣的:((译)PorterDuff.Mode)