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 S∩D 表示 源图像 与 目标图像 不透明区域的交集 ;
⑥ 集合 S ∪ D S \cup D S∪D 表示 源图像 与 目标图像 不透明区域的并集 ;
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=αdst∗Csrc+(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,Sc∗Da+Sc∗(1−Da)] , 前者 D a D_a Da 表示 合成结果对应像 透明度 , 后者 S c ∗ D a + S c ∗ ( 1 − D a ) S_c * D_a + S_c * (1-D_a) Sc∗Da+Sc∗(1−Da) 表示 合成结果对应像 颜色值 ;
-
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 D−S 区域 ( 集合差集运算 : 属于 目标图像不透明区域 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=αdst∗Csrc+(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=αdst∗Csrc+(1−αsrc)∗Cdst 分析 :
- ① α d s t ∗ C s r c \alpha_{dst} * C_{src} αdst∗Csrc 中 , 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=αdst∗Csrc+(1−αsrc)∗Cdst 最终计算结果是 C d s t C_{dst} Cdst ;
Ⅱ . D ∩ S D \cap S D∩S 区域 ( 集合交集运算 : 目标图像不透明区域 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=αdst∗Csrc+(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=αdst∗Csrc+(1−αsrc)∗Cdst 分析 :
- ① α d s t ∗ C s r c \alpha_{dst} * C_{src} αdst∗Csrc 中 , 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=αdst∗Csrc+(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 S∩D 表示 源图像 与 目标图像 不透明区域的交集 ;
⑥ 集合 S ∪ D S \cup D S∪D 表示 源图像 与 目标图像 不透明区域的并集 ;