对图像进行滤镜(PS中的叫法)特效处理完全是导师的要求,现把工作整理出来(效果图见最后)。
一、反色特效
反色特效原理比较简单,就是分别把RGB通道的像素值取反即可。
下面是反色特效VC++程序:
<span style="font-size:14px;">/*************************************************************************
*
* 函数名称:
* Negative(LPBYTE lpDIBBits, LPSTR lpDIB, LONG lWidth, LONG lHeight)
*
* 参数:
* lpDIBBits - 原始图像的像素指针
* lWidth - 原始图像的宽度
* lHeight - 原始图像的高度
*
*
* 说明:
* 实现图像的反色效果。
*
************************************************************************/
BOOL WINAPI Negative(LPBYTE lpDIBBits, LPSTR lpDIB, LONG lWidth, LONG lHeight)
{
// 颜色表中的颜色数目
DWORD wNumColors;//DWORD位32位无符号整型
// 获取DIB中颜色表中的颜色数目
//DIBNumColors()该函数返回DIB中调色板的颜色的种数。对于单色位图,返回2,对于16色位图,返回16,
// 对于256色位图,返回256;对于真彩色位图(24位),没有调色板,返回0。
wNumColors = ::DIBNumColors(lpDIB);
unsigned char *lpSrc;
LONG i, j;
int buf;
if (wNumColors == 256)
{
LONG lLineBytes = WIDTHBYTES(lWidth * 8);
for (i = lHeight; i >= 1; i--)
{
for (j = lWidth; j >= 0; j--)
{
buf = 255 - *((unsigned char*)lpDIBBits + lLineBytes*(lHeight - i) + j);
lpSrc = (unsigned char*)lpDIBBits + lLineBytes*(lHeight - i) + j;
*lpSrc = (unsigned char)buf;
}
}
}
else if (wNumColors == 0)
{
LONG lLineBytes = WIDTHBYTES(lWidth * 24);
for (i = lHeight; i >= 1; i--)
{
for (j = lWidth * 3; j >= 0; j--)
{
buf = 255 - *((unsigned char*)lpDIBBits + lLineBytes*(lHeight - i) + j);
lpSrc = (unsigned char*)lpDIBBits + lLineBytes*(lHeight - i) + j;
*lpSrc = (unsigned char)buf;
}
}
}
else
{
MessageBox(NULL, TEXT("不支持此类型位图!"), TEXT("系统提示"), MB_ICONINFORMATION | MB_YESNO);
}
return TRUE;
}</span>
二、浮雕特效
浮雕图像效果是指图像的前景前向凸出背景。所谓的“浮雕”处理是指图像上的一个像素和它左上方的那个像素之间的差值的一种处理过程,为了使图像保持一定的亮度并呈现灰色,在处理过程中为这个差值加上一个数值为128的常量,需要注意的是,当设置一个像素值的时候,它和它的左上方的像素都要被用到,为了避免用到已经设置过的像素,应该从图像的右下方的像素开始处理,这样还会出现一个问题就是图像最左方和最上方的没有得到处理,这里我把它们的像素值设为128。
下面是浮雕特效VC++程序:
<span style="font-size:14px;">/*************************************************************************
*
* 函数名称:
* Emboss(LPBYTE lpDIBBits, LPSTR lpDIB, LONG lWidth, LONG lHeight)
*
* 参数:
* lpDIBBits - 原始图像的像素指针
* lWidth - 原始图像的宽度
* lHeight - 原始图像的高度
*
*
* 说明:
* 实现图像的浮雕效果。
*
************************************************************************/
BOOL WINAPI Emboss(LPBYTE lpDIBBits, LPSTR lpDIB, LONG lWidth, LONG lHeight)
{
// 颜色表中的颜色数目
DWORD wNumColors;//DWORD位32位无符号整型
// 获取DIB中颜色表中的颜色数目
//DIBNumColors()该函数返回DIB中调色板的颜色的种数。对于单色位图,返回2,对于16色位图,返回16,
// 对于256色位图,返回256;对于真彩色位图(24位),没有调色板,返回0。
wNumColors = ::DIBNumColors(lpDIB);
unsigned char *lpSrc;
LONG i, j;
int buf;
if (wNumColors == 256)