如何用C语言为BMP图像实现黄色色调处理?附灰度化代码
BMP图像黄色色调处理实现方案
黄色色调的核心是强化红、绿分量,削弱蓝分量(因为黄色由红+绿混合而成,蓝是黄色的补色)。以下两种方案可以实现,你可以根据需求选择:
方案一:基于灰度图生成黄色调(保留亮度,风格统一)
先计算像素的灰度值维持亮度,再调整RGB分量生成黄色:
// 计算原始灰度值(和你之前的灰度化逻辑一致) int grayscale = (int)(0.299 * img->pArr[i][j].red + 0.587 * img->pArr[i][j].green + 0.114 * img->pArr[i][j].blue); // 调整RGB分量生成黄色调:增强红、绿,削弱蓝 img->pArr[i][j].red = (int)(grayscale * 1.2); img->pArr[i][j].green = (int)(grayscale * 1.15); img->pArr[i][j].blue = (int)(grayscale * 0.7); // 强制限制RGB分量在0-255范围内(BMP像素分量是8位无符号数,溢出会出错) img->pArr[i][j].red = img->pArr[i][j].red > 255 ? 255 : img->pArr[i][j].red; img->pArr[i][j].green = img->pArr[i][j].green > 255 ? 255 : img->pArr[i][j].green; img->pArr[i][j].blue = img->pArr[i][j].blue < 0 ? 0 : img->pArr[i][j].blue;
方案二:直接对原图加黄色滤镜(保留部分原有色彩)
不经过灰度化,直接修改原像素的RGB分量,保留部分色彩同时偏向黄色:
int red = img->pArr[i][j].red; int green = img->pArr[i][j].green; int blue = img->pArr[i][j].blue; // 增强红、绿,大幅降低蓝分量 img->pArr[i][j].red = (int)(red * 1.1); img->pArr[i][j].green = (int)(green * 1.1); img->pArr[i][j].blue = (int)(blue * 0.4); // 限制分量范围,避免溢出 img->pArr[i][j].red = fmin(fmax(img->pArr[i][j].red, 0), 255); img->pArr[i][j].green = fmin(fmax(img->pArr[i][j].green, 0), 255); img->pArr[i][j].blue = fmin(fmax(img->pArr[i][j].blue, 0), 255);
调整技巧
- 如果想要更浓郁的黄色,可以进一步降低蓝分量的比例(比如0.3),或者提高红、绿的增强比例(比如1.3);
- 若颜色过亮,可适当降低红、绿的增强比例,比如改成1.05;
- 务必保留分量范围限制,否则会出现颜色失真的问题。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

