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



SRC 合成模式

SRC 合成模式 :

  • 1.合成操作 : 源图像像素 替换 目标图像像素 ( 官方说明 ) ;

  • 2.合成方程 ( 新版本表示 ) :

    • ① 计算像素透明度 : α o u t = α s r c \alpha_{out} = \alpha_{src} αout=αsrc
    • ② 计算像素颜色值 : C o u t = C s r c C_{out} = C_{src} Cout=Csrc
    • ③ 隐含条件 ( 像素位置对应 ) : 下面的值都是 对应像素位置 的透明度和颜色值 , 如计算 第 1 行 第 1 列 像素 的透明度 α o u t \alpha_{out} αout , 根据方程其值等于 α s r c \alpha_{src} αsrc , 这个 α s r c \alpha_{src} αsrc 值是 源图像对应 第 1 行 第 1 列 像素的透明度值 ;
  • 3.合成公式 ( 老版本表示 ) : [ S a , S c ] [S_a,S_c] [Sa,Sc] , 前者 S a S_a Sa 表示 合成结果对应像素透明度 , 后者 S c S_c Sc 表示 合成结果对应像 颜色值 ;

  • 4.合成结果展示 :

    • ① 合成前的图片 : 右上角的红色圆形是 目标图像 ( 先绘制 ) , 左下角的蓝色正方向是源图像 ( 后绘制 ) ;
      在这里插入图片描述
    • ② 合成结果 : 只绘制 源图像 ;
      在这里插入图片描述
  • 5.合成模式对应代码 :

 // 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 S S 区域 ( 源图像素 不透明区域 ) : 该区域的 透明度 与 颜色值 与 源图像一样 ;

  • ① 透明度计算 : 根据公式 α o u t = α s r c \alpha_{out} = \alpha_{src} αout=αsrc , 其透明度是源图像的透明度 ;
  • ② 颜色值计算 : 根据公式 C o u t = C s r c C_{out} = C_{src} Cout=Csrc , 其颜色值是源图像的颜色值 ;

∼ S \sim S S 区域 ( 源图像素 透明区域 ) : S S S 区域的补集 ; 该区域的 透明度 与 颜色值 与 源图像一样 ;

  • ① 透明度计算 : 根据公式 , 该区域中 源图 透明度 α s r c \alpha_{src} αsrc 0 0 0 ;
  • ② 颜色值计算 : 根据公式 , 该区域中 源图 颜色 C s r c C_{src} Csrc 0 0 0 ;

上面两个区域 的计算公式是一样的 ;
透明度 : α o u t = α s r c \alpha_{out} = \alpha_{src} αout=αsrc
颜色值 : C o u t = C s r c C_{out} = C_{src} Cout=Csrc

3. 老版本的合成公式说明 : [ S a , S c ] [S_a,S_c] [Sa,Sc] , 前者 S a S_a Sa 表示 合成结果对应像素位置的 透明度 是 S a S_a Sa , 后者 S c S_c Sc 表示 合成结果对应像素位置的颜色值是 S c S_c Sc ;


合成区域描述 :
① 集合 S S S 表示 源图像素 不透明区域 ;
② 集合 D D D 表示目标图像像素 不透明区域 ;
③ 集合 R R R 表示绘制结果的不透明区域 ;
④ 集合 A A A 代表全集所有区域 ( 整个框透明 + 不透明所有区域 ) ;
⑤ 集合 S ∩ D S \cap D SD 表示 源图像 与 目标图像 不透明区域的交集 ;
⑥ 集合 S ∪ D S \cup D SD 表示 源图像 与 目标图像 不透明区域的并集 ;




SRC_ATOP 合成模式

SRC 合成模式 :

  • 1.合成操作 : 源图像像素 不覆盖 目标图像像素 的部分直接丢弃 ; 源图像像素 剩余部分绘制在 目标图像像素 之上 ( 官方说明 ) ;

  • 2.合成方程 ( 新版本表示 ) :

    • ① 计算像素透明度 : α o u t = α d s t \alpha_{out} = \alpha_{dst} αout=αdst
    • ② 计算像素颜色值 : C o u t = α d s t ∗ C s r c + ( 1 − α s r c ) ∗ C d s t C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst} Cout=αdstCsrc+(1αsrc)Cdst
    • ③ 隐含条件 ( 像素位置对应 ) : 下面的值都是 对应像素位置 的透明度和颜色值 , 如计算 第 1 行 第 1 列 像素 的透明度 α o u t \alpha_{out} αout , 根据方程其值等于 α s r c \alpha_{src} αsrc , 这个 α s r c \alpha_{src} α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)] [Da,ScDa+Sc(1Da)] , 前者 D a D_a Da 表示 合成结果对应像 透明度 , 后者 S c ∗ D a + S c ∗ ( 1 − D a ) S_c * D_a + S_c * (1-D_a) ScDa+Sc(1Da) 表示 合成结果对应像 颜色值 ;

  • 4.合成结果展示 :

    • ① 合成前的图片 : 右上角的红色圆形是 目标图像 ( 先绘制 ) , 左下角的蓝色正方向是源图像 ( 后绘制 ) ;
      在这里插入图片描述
    • ② 合成结果 : 绘制 目标图像 不透明部分 , 源图像与目标图像相交部分 绘制源图像 ;
      在这里插入图片描述
  • 5.合成模式对应代码 :

 // 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 DS 区域 ( 集合差集运算 : 属于 目标图像不透明区域 D D D , 不属于 源图像不透明区域区域 S S S ) :

( 1 ) 透明度计算 : 根据公式 α o u t = α d s t \alpha_{out} = \alpha_{dst} αout=αdst , 其透明度是目标图像的透明度 ;

( 2 ) 颜色值计算 : 根据公式 C o u t = α d s t ∗ C s r c + ( 1 − α s r c ) ∗ C d s t C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst} Cout=αdstCsrc+(1αsrc)Cdst 分析 :

该区域 的 相关变量值 :

  • ① 目标图像透明度 : α d s t = 1 \alpha_{dst} = 1 αdst=1
  • ② 目标图像颜色值 : C d s t = 1 C_{dst} = 1 Cdst=1
  • ③ 源图像透明度 : α s r c = 0 \alpha_{src} = 0 αsrc=0
  • ④ 源图像颜色值 : C s r c = 0 C_{src} = 0 Csrc=0

C o u t = α d s t ∗ C s r c + ( 1 − α s r c ) ∗ C d s t C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst} Cout=αdstCsrc+(1αsrc)Cdst 分析 :

  • α d s t ∗ C s r c \alpha_{dst} * C_{src} αdstCsrc 中 , C s r c C_{src} Csrc 源图像颜色值是 0 0 0 , 因此前半部分计算出来是 0 0 0 ;
  • ( 1 − α s r c ) ∗ C d s t (1-\alpha_{src}) * C_{dst} (1αsrc)Cdst 中 , 源图像的透明度是 0 0 0, 其计算结果是 1 1 1 ;

因此 C o u t = α d s t ∗ C s r c + ( 1 − α s r c ) ∗ C d s t C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst} Cout=αdstCsrc+(1αsrc)Cdst 最终计算结果是 C d s t C_{dst} Cdst ;



Ⅱ . D ∩ S D \cap S DS 区域 ( 集合交集运算 : 目标图像不透明区域 D D D , 与 源图像不透明区域 S S S , 的交集 ) :

( 1 ) 透明度计算 : 根据公式 α o u t = α d s t \alpha_{out} = \alpha_{dst} αout=αdst , 其透明度是目标图像的透明度 , 是 1 1 1 ;

( 2 ) 颜色值计算 : 根据公式 C o u t = α d s t ∗ C s r c + ( 1 − α s r c ) ∗ C d s t C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst} Cout=αdstCsrc+(1αsrc)Cdst 分析 :

该区域 的 相关变量值 :

  • ① 目标图像透明度 : α d s t = 1 \alpha_{dst} = 1 αdst=1
  • ② 目标图像颜色值 : C d s t = 1 C_{dst} = 1 Cdst=1
  • ③ 源图像透明度 : α s r c = 1 \alpha_{src} = 1 αsrc=1
  • ④ 源图像颜色值 : C s r c = 1 C_{src} = 1 Csrc=1

C o u t = α d s t ∗ C s r c + ( 1 − α s r c ) ∗ C d s t C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst} Cout=αdstCsrc+(1αsrc)Cdst 分析 :

  • α d s t ∗ C s r c \alpha_{dst} * C_{src} αdstCsrc 中 , C s r c C_{src} Csrc 源图像颜色值是 1 1 1 , 因此前半部分计算出来是 C s r c C_{src} Csrc ;
  • ( 1 − α s r c ) ∗ C d s t (1-\alpha_{src}) * C_{dst} (1αsrc)Cdst 中 , 源图像的透明度是 1 1 1, 其计算结果是 0 0 0 ;

因此 C o u t = α d s t ∗ C s r c + ( 1 − α s r c ) ∗ C d s t C_{out} = \alpha_{dst} * C_{src} + (1-\alpha_{src}) * C_{dst} Cout=αdstCsrc+(1αsrc)Cdst 最终计算结果是 C s r c C_{src} Csrc ;



上面两个区域 的计算公式是一样的 ;
透明度 : α o u t = α s r c \alpha_{out} = \alpha_{src} αout=αsrc
颜色值 : C o u t = C s r c C_{out} = C_{src} Cout=Csrc


合成区域描述 :
① 集合 S S S 表示 源图像素 不透明区域 ;
② 集合 D D D 表示目标图像像素 不透明区域 ;
③ 集合 R R R 表示绘制结果的不透明区域 ;
④ 集合 A A A 代表全集所有区域 ( 整个框透明 + 不透明所有区域 ) ;
⑤ 集合 S ∩ D S \cap D SD 表示 源图像 与 目标图像 不透明区域的交集 ;
⑥ 集合 S ∪ D S \cup D SD 表示 源图像 与 目标图像 不透明区域的并集 ;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值