【VC开源代码栏目提醒】:网学会员鉴于大家对VC开源代码十分关注,论文会员在此为大家搜集整理了“Filter.cpp”一文,供大家参考学习
#include "StdAfx.h"
#include "Filter.h"
#include "improve.h"
/******************************************************************************
* 作用: 图像反色函数
* 参数:
* pixel 原始图像的像素数组
* tempPixel 输出图像的像素数组
* width 原始图像宽度
* height 原始图像高度
******************************************************************************/
void Negative(BYTE* pixel, BYTE* tempPixel, int width, int height)
{
//计算像素数组的长度
int sum = width * height * 4;
memcpy(pixel, tempPixel, sum);
for(int i = 0; i < sum; i += 4)
{
// 对像素值取反
tempPixel[i] = 255 - tempPixel[i]; //blue
tempPixel[i+1] = 255 - tempPixel[i+1]; //green
tempPixel[i+2] = 255 - tempPixel[i+2]; //red
}
}
/******************************************************************************
* 作用: 实现图像的浮雕效果
* 参数:
* pixel 原始图像的像素数组
* tempPixel 输出图像的像素数组
* width 原始图像宽度
* height 原始图像高度
******************************************************************************/
void Emboss(BYTE* pixel, BYTE* tempPixel, int width, int height)
{
//计算像素数组的长度
int sum = width * height *4;
memcpy(tempPixel, pixel, sum);
int r = 0, g = 0, b = 0;
for(int i = 0; i < height-1; i++)
{
for (int j = 0; j < (width-1)*4; j+=4)
{
//处理像素值
b = abs(tempPixel[i*width*4+j]
-tempPixel[(i+1)*width*4+j+4]+128);
g = abs(tempPixel[i*width*4+j+1]
-tempPixel[(i+1)*width*4+j+5]+128);
r = abs(tempPixel[i*width*4+j+2]
-tempPixel[(i+1)*width*4+j+6]+128);
//对于越界的像素值进行处理
if (r>255)
r=255;
if (g>255)
g=255;
if (b>255)
b=255;
tempPixel[i*width*4 + j] = b;//blue
tempPixel[i*width*4 + j + 1] = g;//green
tempPixel[i*width*4 + j + 2] = r;//red
}
}
for (int k = width * 4 * (height-1); k < width*4*height; k += 4)
{
tempPixel[k]=128;
tempPixel[k+1]=128;
tempPixel[k+2]=128;
}
for (int l = (width-1) * 4; l < width*4*height; l += width*4)
{
tempPixel[l]=128;
tempPixel[l+1]=128;
tempPixel[l+2]=128;
}
}
/******************************************************************************
* 作用: 实现图像的黑白效果
* 参数:
* pixel 原始图像的像素数组
* tempPixel 输出图像的像素数组
* width 原始图像宽度
* height 原始图像高度
******************************************************************************/
void ColorToBW(BYTE* pixel, BYTE* tempPixel, int width, int height)
{
//计算像素数组的长度
int sum = width * height * 4;
memcpy(tempPixel, pixel, sum);
for(int i = 0; i < sum; i += 4)
{
//平均值法
tempPixel[i] = (tempPixel[i] + tempPixel[i+1] + tempPixel[i+2]) / 3; //blue
tempPixel[i + 1] = tempPixel[i]; //green
tempPixel[i + 2] = tempPixel[i]; //red
//最大值法
/*
tempPixel[i] = tempPixel[i] > tempPixel[i+1]?
tempPixel[i] : tempPixel[i+1];
tempPixel[i] = tempPixel[i] >tempPixel[i+2]?
tempPixel[i] : tempPixel[i+2];
tempPixel[i+1] = tempPixel[i] ;
tempPixel[i+2] = tempPixel[i];
*/
//加权平均值法
/*
tempPixel[i] =( ((int) (tempPixel[i]*0.5)) +
((int) (tempPixel[i+1]*0.3)) +
((int) (tempPixel[i+2]*0.2)) ;
tempPixel[i + 1] = tempPixel[i]; //green
tempPixel[i + 2] = tempPixel[i];
*/
}
}
/******************************************************************************
* 作用: 实现水平方式的雾化效果
* 参数:
* pixel 原始图像的像素数组
* tempPixel 输出图像的像素数组
* width 原始图像宽度
* height 原始图像高度
* f 雾化参数
******************************************************************************/
void HorFog(BYTE* pixel, BYTE* tempPixel, int width, int height, int f)
{
int k;
int n;
for(int i = 0; i < height; i++)
{
for (int j = 0; j < width*4; j += 4)
{
k = abs(rand() % f);
n = j + k*4;
if (n>(width-1) * 4)
n = (width-1)*4;
tempPixel[i*width*4 + j] = pixel[i*width*4 + n];
tempPixel[i*width*4 + j + 1] = pixel[i*width*4 + n + 1];
tempPixel[i*width*4 + j + 2] = pixel[i*width*4 + n + 2];
tempPixel[i*width*4 + j + 3] = pixel[i*width*4 + n + 3];
}
}
}
/******************************************************************************
* 作用: 实现垂直方式的雾化效果
* 参数:
* pixel 原始图像的像素数组
* tempPixel 输出图像的像素数组
* width 原始图像宽度
* height 原始图像高度
* f 雾化参数
******************************************************************************/
void VerFog(BYTE* pixel, BYTE