图像染色的算法很简单,首先指定一种渲染颜色,然后计算当前象素的平均值,用当前象素的平均值分别乘以渲染色的R、G、B分量值并除与255,将结果做为当前象素的最终颜色:
1. 求出某个像素点的通道平均值
2. 用平局值分别乘与颜色的R、G、B三个分量,再分别除与255
void OnChangeStaining(const Mat matSrc, Mat &matDst, COLORREF color)
{
// 准备数据
int rows = matSrc.rows;
int cols = matSrc.cols;
int step = matSrc.step;
int channels = matSrc.channels();
uchar *pSData = matSrc.data;
uchar *pDData = matDst.data;
byte r = GetRValue(color);
byte g = GetGValue(color);
byte b = GetBValue(color);
// 使用数组形式修改Mat以达到高效的目的
int index;
float avg;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
// 因为cols只是图片宽度,而图片是三通道的我们要修改三个通道的数据,必须要乘与通道数
// step = cols * channels
// i * step 表示一行的数据
// j * channels 表示第j列的数据
index = i * step + j * channels;
avg = (float)(pSData[index + 0] + pSData[index + 1] + pSData[index + 2]) / 3;
// 因为Mat存储数据的方式就是BGR,所以第0位是B
pDData[index + 0] = (byte)(b * avg / 255);
pDData[index + 1] = (byte)(g * avg / 255);
pDData[index + 2] = (byte)(r * avg / 255);
}
}
}