目标:实现带alpha通道的多个图像合并生成新的图像
格式:每个图层的数据格式为像素数组,每个像素由rgba四个值组成。
方法:计算两层中位置相对应的两个像素的rgba计算后得出的新像素rgba值,即得到新图层的图像;新的图层再与下一个图层按相同的算法合并,直到所有图层合并完成。
算法:实现算法分为两种--
+ 第一种是计算机底层绘制过程的算法,结果为显示在屏幕上的视觉效果,无alpha通道。按照绘制的顺序,从最底下的图层往上逐层合并。
公式如下:(注:1上层颜色 2下层颜色)
+ 第二种是生成目标图像数据的算法,结果为图像本身的数据,因此结果数据中保留alpha通道。按照视觉看到的顺序,从最顶的图层往下逐层合并。
公式如下:(注:1上层颜色 2下层颜色)
*注:以上两种算法计算结果需要四舍五入取整,并限定在0~255
格式:每个图层的数据格式为像素数组,每个像素由rgba四个值组成。
方法:计算两层中位置相对应的两个像素的rgba计算后得出的新像素rgba值,即得到新图层的图像;新的图层再与下一个图层按相同的算法合并,直到所有图层合并完成。
算法:实现算法分为两种--
+ 第一种是计算机底层绘制过程的算法,结果为显示在屏幕上的视觉效果,无alpha通道。按照绘制的顺序,从最底下的图层往上逐层合并。
公式如下:(注:1上层颜色 2下层颜色)
alpha = A1 / 255;
R = R1 * alpha + R2 * (1 - alpha);
G = G1 * alpha + G2 * (1 - alpha);
B = B1 * alpha + B2 * (1 - alpha);
+ 第二种是生成目标图像数据的算法,结果为图像本身的数据,因此结果数据中保留alpha通道。按照视觉看到的顺序,从最顶的图层往下逐层合并。
公式如下:(注:1上层颜色 2下层颜色)
if (255 == A1 && 255 == A2) {
R = G = B = A = 0;
} else {
alpha1 = A1 / 255;
alpha2 = A2 / 255;
R = R1 * alpha1 + R2 * alpha2 * (1 - alpha1);
G = G1 * alpha1 + G2 * alpha2 * (1 - alpha1);
B = B1 * alpha1 + B2 * alpha2 * (1 - alpha1);
A = 1 - (1 - alpha1) * ( 1 - alpha2);
R = R / A;
G = G / A;
B = B / A;
}
*注:以上两种算法计算结果需要四舍五入取整,并限定在0~255
int clamp(int val) {
if (val < 0) return 0;
if (val > 255) return 255;
return val;
};
R = clamp((int)R + 0.5);
G = clamp((int)G + 0.5);
B = clamp((int)B + 0.5);
A = clamp((int)A + 0.5);