rgba图层混合算法--公式

目标:实现带alpha通道的多个图像合并生成新的图像
格式:每个图层的数据格式为像素数组,每个像素由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);


你可能感兴趣的:(rgba图层混合算法--公式)