前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 应用开发】Xfermod 图形组合 之 SRC 类 合成模式 ( SRC | SRC_ATOP | 详细解析官方给出的透明度和颜色值计算公式 )

【Android 应用开发】Xfermod 图形组合 之 SRC 类 合成模式 ( SRC | SRC_ATOP | 详细解析官方给出的透明度和颜色值计算公式 )

作者头像
韩曙亮
发布2023-03-27 16:46:06
3K0
发布2023-03-27 16:46:06
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

SRC 合成模式

SRC 合成模式 :

  • 1.合成操作 : 源图像像素 替换 目标图像像素 ( 官方说明 ) ;
  • 2.合成方程 ( 新版本表示 ) :
    • ① 计算像素透明度 :
    \alpha_{out} = \alpha_{src}
    • ② 计算像素颜色值 :
    C_{out} = C_{src}
    • ③ 隐含条件 ( 像素位置对应 ) : 下面的值都是 对应像素位置 的透明度和颜色值 , 如计算 第 1 行 第 1 列 像素 的透明度
    \alpha_{out}

    , 根据方程其值等于

    \alpha_{src}

    , 这个

    \alpha_{src}

    值是 源图像对应 第 1 行 第 1 列 像素的透明度值 ;

  • 3.合成公式 ( 老版本表示 ) :
[S_a,S_c]

, 前者

S_a

表示 合成结果对应像素透明度 , 后者

S_c

表示 合成结果对应像 颜色值 ;

  • 4.合成结果展示 :
    • ① 合成前的图片 : 右上角的红色圆形是 目标图像 ( 先绘制 ) , 左下角的蓝色正方向是源图像 ( 后绘制 ) ;
    在这里插入图片描述
    在这里插入图片描述
    • ② 合成结果 : 只绘制 源图像 ;
    在这里插入图片描述
    在这里插入图片描述
  • 5.合成模式对应代码 :
代码语言:javascript
复制
 // 1.创建画笔
 Paint paint = new Paint();
 // 2.绘制目标图像 ( Destination Image ) 先绘制
 canvas.drawBitmap(destinationImage, 0, 0, paint);

 // 3.设置 Xfermod 图形组合模式
 PorterDuff.Mode mode = PorterDuff.Mode.SRC;
 paint.setXfermode(new PorterDuffXfermode(mode));

 // 4.绘制 源图像 ( Source Image ) 后绘制
 canvas.drawBitmap(sourceImage, 0, 0, paint);

SRC 合成模式详细解析

合成方程解析 :

1. 合成后的图像描述 : 只绘制 源图像 , 不绘制 目标图像 ;

2. 合成的计算过程 ( 按照区域 和 公式 分析透明度和颜色值 ) :

S

区域 ( 源图像素 不透明区域 ) : 该区域的 透明度 与 颜色值 与 源图像一样 ;

  • ① 透明度计算 : 根据公式
\alpha_{out} = \alpha_{src}

, 其透明度是源图像的透明度 ;

  • ② 颜色值计算 : 根据公式
C_{out} = C_{src}

, 其颜色值是源图像的颜色值 ;

\sim S

区域 ( 源图像素 透明区域 ) :

S

区域的补集 ; 该区域的 透明度 与 颜色值 与 源图像一样 ;

  • ① 透明度计算 : 根据公式 , 该区域中 源图 透明度
\alpha_{src}

0

;

  • ② 颜色值计算 : 根据公式 , 该区域中 源图 颜色
C_{src}

0

;

上面两个区域 的计算公式是一样的 ; 透明度 :

\alpha_{out} = \alpha_{src}

颜色值 :

C_{out} = C_{src}

3. 老版本的合成公式说明 :

[S_a,S_c]

, 前者

S_a

表示 合成结果对应像素位置的 透明度 是

S_a

, 后者

S_c

表示 合成结果对应像素位置的颜色值是

S_c

;

合成区域描述 : ① 集合

S

表示 源图像素 不透明区域 ; ② 集合

D

表示目标图像像素 不透明区域 ; ③ 集合

R

表示绘制结果的不透明区域 ; ④ 集合

A

代表全集所有区域 ( 整个框透明 + 不透明所有区域 ) ; ⑤ 集合

S \cap D

表示 源图像 与 目标图像 不透明区域的交集 ; ⑥ 集合

S \cup D

表示 源图像 与 目标图像 不透明区域的并集 ;


SRC_ATOP 合成模式

SRC 合成模式 :

  • 1.合成操作 : 源图像像素 不覆盖 目标图像像素 的部分直接丢弃 ; 源图像像素 剩余部分绘制在 目标图像像素 之上 ( 官方说明 ) ;
  • 2.合成方程 ( 新版本表示 ) :
    • ① 计算像素透明度 :
    \alpha_{out} = \alpha_{dst}
    • ② 计算像素颜色值 :
    C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst}
    • ③ 隐含条件 ( 像素位置对应 ) : 下面的值都是 对应像素位置 的透明度和颜色值 , 如计算 第 1 行 第 1 列 像素 的透明度
    \alpha_{out}

    , 根据方程其值等于

    \alpha_{src}

    , 这个

    \alpha_{src}

    值是 源图像对应 第 1 行 第 1 列 像素的透明度值 ;

  • 3.合成公式 ( 老版本表示 ) :
[D_a,S_c * D_a + S_c * (1-D_a)]

, 前者

D_a

表示 合成结果对应像 透明度 , 后者

S_c * D_a + S_c * (1-D_a)

表示 合成结果对应像 颜色值 ;

  • 4.合成结果展示 :
    • ① 合成前的图片 : 右上角的红色圆形是 目标图像 ( 先绘制 ) , 左下角的蓝色正方向是源图像 ( 后绘制 ) ;
    在这里插入图片描述
    在这里插入图片描述
    • ② 合成结果 : 绘制 目标图像 不透明部分 , 源图像与目标图像相交部分 绘制源图像 ;
    在这里插入图片描述
    在这里插入图片描述
  • 5.合成模式对应代码 :
代码语言:javascript
复制
 // 1.创建画笔
 Paint paint = new Paint();
 // 2.绘制目标图像 ( Destination Image ) 先绘制
 canvas.drawBitmap(destinationImage, 0, 0, paint);

 // 3.设置 Xfermod 图形组合模式
 PorterDuff.Mode mode = PorterDuff.Mode.SRC_ATOP;
 paint.setXfermode(new PorterDuffXfermode(mode));

 // 4.绘制 源图像 ( Source Image ) 后绘制
 canvas.drawBitmap(sourceImage, 0, 0, paint);

SRC_ATOP 合成模式详细解析

合成方程解析 :

1. 合成后的图像描述 : 绘制区域 只绘制目标图像不透明的区域 , 源图像与目标图像交集区域 绘制源图像 , 不相交的剩余区域绘制目标图像 ;

2. 合成的计算过程 ( 按照区域 和 公式 分析透明度和颜色值 ) :

Ⅰ.

D-S

区域 ( 集合差集运算 : 属于 目标图像不透明区域

D

, 不属于 源图像不透明区域区域

S

) :

( 1 ) 透明度计算 : 根据公式

\alpha_{out} = \alpha_{dst}

, 其透明度是目标图像的透明度 ;

( 2 ) 颜色值计算 : 根据公式

C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst}

分析 :

该区域 的 相关变量值 :

  • ① 目标图像透明度 :
\alpha_{dst} = 1
  • ② 目标图像颜色值 :
C_{dst} = 1
  • ③ 源图像透明度 :
\alpha_{src} = 0
  • ④ 源图像颜色值 :
C_{src} = 0
C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst}

分析 :

\alpha_{dst} * C_{src}

中 ,

C_{src}

源图像颜色值是

0

, 因此前半部分计算出来是

0

;

(1-\alpha_{src}) * C_{dst}

中 , 源图像的透明度是

0

, 其计算结果是

1

;

因此

C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst}

最终计算结果是

C_{dst}

;

Ⅱ .

D \cap S

区域 ( 集合交集运算 : 目标图像不透明区域

D

, 与 源图像不透明区域

S

, 的交集 ) :

( 1 ) 透明度计算 : 根据公式

\alpha_{out} = \alpha_{dst}

, 其透明度是目标图像的透明度 , 是

1

;

( 2 ) 颜色值计算 : 根据公式

C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst}

分析 :

该区域 的 相关变量值 :

  • ① 目标图像透明度 :
\alpha_{dst} = 1
  • ② 目标图像颜色值 :
C_{dst} = 1
  • ③ 源图像透明度 :
\alpha_{src} = 1
  • ④ 源图像颜色值 :
C_{src} = 1
C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst}

分析 :

\alpha_{dst} * C_{src}

中 ,

C_{src}

源图像颜色值是

1

, 因此前半部分计算出来是

C_{src}

;

(1-\alpha_{src}) * C_{dst}

中 , 源图像的透明度是

1

, 其计算结果是

0

;

因此

C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst}

最终计算结果是

C_{src}

;

上面两个区域 的计算公式是一样的 ; 透明度 :

\alpha_{out} = \alpha_{src}

颜色值 :

C_{out} = C_{src}

合成区域描述 : ① 集合

S

表示 源图像素 不透明区域 ; ② 集合

D

表示目标图像像素 不透明区域 ; ③ 集合

R

表示绘制结果的不透明区域 ; ④ 集合

A

代表全集所有区域 ( 整个框透明 + 不透明所有区域 ) ; ⑤ 集合

S \cap D

表示 源图像 与 目标图像 不透明区域的交集 ; ⑥ 集合

S \cup D

表示 源图像 与 目标图像 不透明区域的并集 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
    • SRC 合成模式
      • SRC 合成模式详细解析
        • SRC_ATOP 合成模式
          • SRC_ATOP 合成模式详细解析
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档