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);


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RGBA像的缩小算法可以分为两个步骤:先将RGBA像转换为RGB像,再对RGB像进行缩小。以下是一个简单的RGBA像缩小算法的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define SCALE 2 // 缩小倍数 typedef struct Pixel { unsigned char r, g, b, a; } Pixel; int main() { FILE *fp1, *fp2; Pixel *image, *result; int i, j, k, l; int width, height; // 像尺寸 int new_width, new_height; // 缩小后像尺寸 // 打开原始片文件 if ((fp1 = fopen("input.rgba", "rb")) == NULL) { printf("Cannot open input file.\n"); exit(1); } // 读取原始片像素数据 fseek(fp1, 16L, SEEK_SET); fread(&width, sizeof(int), 1, fp1); fread(&height, sizeof(int), 1, fp1); image = (Pixel*) malloc(width * height * sizeof(Pixel)); fread(image, sizeof(Pixel), width * height, fp1); // 关闭原始片文件 fclose(fp1); // 转换为RGB像 result = (Pixel*) malloc(width * height * sizeof(Pixel)); for (i = 0; i < width * height; i++) { result[i].r = image[i].r; result[i].g = image[i].g; result[i].b = image[i].b; result[i].a = image[i].a; } // 缩小片 new_width = width / SCALE; new_height = height / SCALE; for (i = 0; i < new_height; i++) { for (j = 0; j < new_width; j++) { int sum_r = 0, sum_g = 0, sum_b = 0; for (k = 0; k < SCALE; k++) { for (l = 0; l < SCALE; l++) { sum_r += result[(i * SCALE + k) * width + j * SCALE + l].r; sum_g += result[(i * SCALE + k) * width + j * SCALE + l].g; sum_b += result[(i * SCALE + k) * width + j * SCALE + l].b; } } image[i * new_width + j].r = sum_r / (SCALE * SCALE); image[i * new_width + j].g = sum_g / (SCALE * SCALE); image[i * new_width + j].b = sum_b / (SCALE * SCALE); image[i * new_width + j].a = result[i * SCALE * width + j * SCALE].a; } } // 创建缩小后片文件 if ((fp2 = fopen("output.rgb", "wb")) == NULL) { printf("Cannot open output file.\n"); exit(1); } // 写入缩小后片像素数据 fwrite(&new_width, sizeof(int), 1, fp2); fwrite(&new_height, sizeof(int), 1, fp2); fwrite(image, sizeof(Pixel), new_width * new_height, fp2); // 关闭缩小后片文件 fclose(fp2); // 释放内存 free(image); free(result); return 0; } ``` 该程序将一个RGBA格式片按照2倍缩小后输出到另一个RGB格式文件中。程序中通过打开原始片文件,读取原始片像素数据,转换为RGB像,缩小片,创建缩小后片文件,写入缩小后片像素数据等步骤实现了RGBA像缩小的功能。需要注意的是,该程序中RGBA格式片的每个像素点由4个字节组成(R、G、B、A四个分量),而RGB格式片的每个像素点只由3个字节组成(R、G、B三个分量)。因此在转换为RGB像时需要舍弃A分量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值