SRC 合成模式 :
1.合成操作 : 源图像像素 替换 目标图像像素 ( 官方说明 ) ;
2.合成方程 ( 新版本表示 ) :
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);
合成方程解析 :
1. 合成后的图像描述 : 只绘制 源图像 , 不绘制 目标图像 ;
2. 合成的计算过程 ( 按照区域 和 公式 分析透明度和颜色值 ) :
S S S 区域 ( 源图像素 不透明区域 ) : 该区域的 透明度 与 颜色值 与 源图像一样 ;
∼ S \sim S ∼S 区域 ( 源图像素 透明区域 ) : 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
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 合成模式 :
1.合成操作 : 源图像像素 不覆盖 目标图像像素 的部分直接丢弃 ; 源图像像素 剩余部分绘制在 目标图像像素 之上 ( 官方说明 ) ;
2.合成方程 ( 新版本表示 ) :
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);
合成方程解析 :
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 分析 :
该区域 的 相关变量值 :
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 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 分析 :
该区域 的 相关变量值 :
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 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 表示 源图像 与 目标图像 不透明区域的并集 ;