#种常用图像处理算法(函数)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8种常用图像处理算法<函数)这是我毕业设计地一部分代码
/************************************************************************* *
* 函数名称:
*
* VertMirror(>
*
* 参数:
*
* LPSTR lpDIB //指向源DIB图像指针
*
* 返回值:
*
* BOOL //镜像成功返回TRUE,否则返回FALSE.
*
* 说明:
*
* 该函数用来实现DIB图像地垂直镜像.
*
************************************************************************/ BOOL WINAPI VertMirror(LPSTR lpDIB>
{
//原图象宽度
LONG lWidth。

//原图象高度
LONG lHeight。

//原图象地颜色数
WORD wNumColors。

//原图象地信息头结构指针
LPBITMAPINFOHEADER lpbmi。

//指向原图象和目地图象地像素地指针
LPBYTE lpSrc,lpDst。

//平移后剩余图像在源图像中地位置<矩形区域)
CRect rectSrc。

//指向原图像像素地指针
LPBYTE lpDIBBits。

//指向复制图像像素地指针
LPBYTE lpNewDIBBits。

//内存句柄
HLOCAL h。

//循环变量
LONG i。

//图像每行地字节数
LONG lLineBytes。

//获取图象地信息头结构地指针
lpbmi=(LPBITMAPINFOHEADER>lpDIB。

//找到图象地像素位置
lpDIBBits=(LPBYTE>::FindDIBBits(lpDIB>。

//获取图象地宽度
lWidth=::DIBWidth(lpDIB>。

//获取图象地高度
lHeight=::DIBHeight(lpDIB>。

//获取图象地颜色数
wNumColors=::DIBNumColors(lpDIB>。

//计算图像每行地字节数
lLineBytes = WIDTHBYTES(lWidth *(lpbmi->biBitCount>>。

// 暂时分配内存,以保存新图像
h= LocalAlloc(LHND, lLineBytes>。

// 分配内存失败,直接返回
if (!h>
return FALSE。

// 锁定内存
lpNewDIBBits = (LPBYTE>LocalLock(h>。

//如果是256色位图或真彩色位图
if(wNumColors==256||wNumColors==0>
{
//平移图像,每次移动一行
for(i = 0。

i<lHeight/2。

i++>
{
//指向原图象倒数第i行像素起点地指针
lpSrc =(LPBYTE>lpDIBBits + lLineBytes * i。

//目标区域同样要注意上下倒置地问题
lpDst =(LPBYTE>lpDIBBits+lLineBytes * (lHeight-i-1> 。

//备份一行
memcpy(lpNewDIBBits, lpDst, lLineBytes>。

//将倒数第i行像素复制到第i行
memcpy(lpDst, lpSrc, lLineBytes>。

//将第i行像素复制到第i行
memcpy(lpSrc, lpNewDIBBits, lLineBytes>。

}
}
else
{
AfxMessageBox("只支持256色和真彩色位图">。

// 释放内存
LocalUnlock(h>。

LocalFree(h>。

return false。

}
// 释放内存
LocalUnlock(h>。

LocalFree(h>。

// 返回
return TRUE。

}
/************************************************************************* *
* 函数名称:
*
* RotateDIB (>
*
* 参数:
*
* LPSTR lpDIB //指向源DIB图像指针
*
* int iAngle
* 说明:
*
* 该函数用来实现DIB图像地旋转.
*
************************************************************************/ HGLOBAL WINAPI RotateDIB(LPSTR lpDIB,int iAngle>
{
//原图象宽度
LONG lWidth。

//原图象高度
LONG lHeight。

//旋转后图象宽度
LONG lNewWidth。

//旋转后图象高度
LONG lNewHeight。

//原图象地颜色数
WORD wNumColors。

//原图象地信息头结构指针
LPBITMAPINFOHEADER lpbmi,lpbmi0。

//指向原图象和目地图象地像素地指针
LPBYTE lpSrc,lpDst。

//指向原图像像素地指针
LPBYTE lpDIBBits。

//指向旋转后图像<像素)地指针
LPBYTE lpNewDIBBits。

LPSTR lpNewDIB。

//旋转后新地DIB句柄
HDIB hDIB。

//循环变量
LONG i,j,i0,j0。

//原图像每行地字节数
LONG lLineBytes。

//旋转后图像每行地字节数
LONG lNewLineBytes。

//旋转角度地弧度
double fArcAngle。

//旋转角度地正弦和余弦
float fSin,fCos。

//旋转前图象四个角地坐标<以图象中心为坐标系原点)
float fSrcX1,fSrcY1,fSrcX2,fSrcY2。

float fSrcX3,fSrcY3,fSrcX4,fSrcY4。

//旋转后图象四个角地坐标<以图象中心为坐标系原点)
float fDstX1,fDstY1,fDstX2,fDstY2。

float fDstX3,fDstY3,fDstX4,fDstY4。

//两个中间量
float f1,f2。

//找到图象地像素位置
lpDIBBits=(LPBYTE>::FindDIBBits(lpDIB>。

//获取图象地宽度
lWidth=::DIBWidth(lpDIB>。

//获取图象地高度
lHeight=::DIBHeight(lpDIB>。

//获取图象地颜色数
wNumColors=::DIBNumColors(lpDIB>。

//获取指向原位图信息头结构地指针
lpbmi0=(LPBITMAPINFOHEADER>lpDIB。

//计算原图像每行地字节数
lLineBytes = WIDTHBYTES(lWidth *(lpbmi0->biBitCount>>。

//将旋转角度从度转换到弧度
fArcAngle =(iAngle*PI>/180.0。

//计算旋转角度地正弦
fSin = (float> sin(fArcAngle>。

//计算旋转角度地余弦
fCos = (float> cos(fArcAngle>。

//计算原图地四个角地坐标<以图像中心为坐标系原点)
fSrcX1 = (float> (- (lWidth - 1> / 2>。

fSrcY1 = (float> ( (lHeight - 1> / 2>。

fSrcX2 = (float> ( (lWidth - 1> / 2>。

fSrcY2 = (float> ( (lHeight - 1> / 2>。

fSrcX3 = (float> (- (lWidth - 1> / 2>。

fSrcY3 = (float> (- (lHeight - 1> / 2>。

fSrcX4 = (float> ( (lWidth - 1> / 2>。

fSrcY4 = (float> (- (lHeight - 1> / 2>。

//计算新图四个角地坐标<以图像中心为坐标系原点)
fDstX1 = fCos * fSrcX1 + fSin * fSrcY1。

fDstY1 = -fSin * fSrcX1 + fCos * fSrcY1。

fDstX2 = fCos * fSrcX2 + fSin * fSrcY2。

fDstY2 = -fSin * fSrcX2 + fCos * fSrcY2。

fDstX3 = fCos * fSrcX3 + fSin * fSrcY3。

fDstY3 = -fSin * fSrcX3 + fCos * fSrcY3。

fDstX4 = fCos * fSrcX4 + fSin * fSrcY4。

fDstY4 = -fSin * fSrcX4 + fCos * fSrcY4。

//计算旋转后地图像实际宽度
lNewWidth = (LONG> ( max( fabs(fDstX4 - fDstX1>,
fabs(fDstX3 - fDstX2> > + 0.5>。

//计算旋转后地图像高度
lNewHeight = (LONG> ( max( fabs(fDstY4 - fDstY1>,
fabs(fDstY3 - fDstY2> > + 0.5>。

//计算旋转后图像每行地字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * lpbmi0->biBitCount>。

//计算两个常数
f1 = (float> (-0.5 * (lNewWidth - 1> * fCos - 0.5 * (lNewHeight - 1> * fSin + 0.5 * (lWidth - 1>>。

f2 = (float> ( 0.5 * (lNewWidth - 1> * fSin - 0.5 * (lNewHeight - 1> * fCos + 0.5 * (lHeight - 1>>。

//暂时分配内存,以保存新图像
hDIB=(HDIB>::GlobalAlloc(GHND, lNewHeight*lNewLineBytes+ *(LPDWORD>lpDIB+::PaletteSize(lpDIB>>。

//分配内存失败,直接返回
if (!hDIB>
return NULL。

//锁定内存
lpNewDIB = (LPSTR>::GlobalLock((HGLOBAL>hDIB>。

//复制DIB信息头和调色板
memcpy(lpNewDIB,lpDIB,*(LPDWORD>lpDIB+::PaletteSize(lpDIB>>。

//获取图象地信息头结构地指针
lpbmi=(LPBITMAPINFOHEADER>lpNewDIB。

//更新DIB图象地高度和宽度
lpbmi->biWidth=lNewWidth。

lpbmi->biHeight=lNewHeight。

//找到新DIB像素地起始位置
lpNewDIBBits=(LPBYTE>::FindDIBBits(lpNewDIB>。

//如果是256色位图
if(wNumColors==256>
{
//旋转后图像每行
for(i = 0。

i<lNewHeight。

i++>
{
//旋转后图象每列
for(j=0。

j<lNewWidth。

j++>
{
//指向图象第i行第j个像素地指针
lpDst =(LPBYTE>lpNewDIBBits + lNewLineBytes * (lNewHeight-1-i>+j。

//计算每个像素点在原图象中地坐标
i0 = (LONG> (-((float> j> * fSin + ((float> i> * fCos + f2 + 0.5>。

j0 = (LONG> ( ((float> j> * fCos + ((float> i> * fSin + f1 + 0.5>。

// 判断是否在源图象范围之内
if( (j0 >= 0> && (j0 < lWidth> && (i0 >= 0> && (i0 < lHeight>>
{
// 指向源DIB图象第i0行,第j0个象素地指针
lpSrc = (LPBYTE>lpDIBBits + lLineBytes * (lHeight - 1 - i0> + j0。

// 复制象素
*lpDst = *lpSrc。

}
else
{
// 对于源图中没有地象素,直接赋值为255
* ((LPBYTE>lpDst> = 255。

}
}
}
}
//如果是24位真彩色位图
else if(wNumColors==0>
{
//旋转后图像每行
for(i = 0。

i<lNewHeight。

i++>
{
//旋转后图象每列
for(j=0。

j<lNewWidth。

j++>
{
//指向图象第i行第j个像素地指针
lpDst =(LPBYTE>lpNewDIBBits + lNewLineBytes * (lNewHeight-1-i>+3*j。

//计算每个像素点在原图象中地坐标
i0 = (LONG> (-((float> j> * fSin + ((float> i> * fCos + f2 + 0.5>。

j0 = (LONG> ( ((float> j> * fCos + ((float> i> * fSin + f1 + 0.5>。

// 判断是否在源图象范围之内
if( (j0 >= 0> && (j0 < lWidth> && (i0 >= 0> && (i0 < lHeight>>
{
// 指向源DIB图象第i0行,第j0个象素地指针
lpSrc = (LPBYTE>lpDIBBits + lLineBytes * (lHeight - 1 - i0> + 3*j0。

// 复制象素
memcpy(lpDst,lpSrc,3>。

}
else
{
// 对于源图中没有地象素,直接赋值为255
memset(lpDst,255,3>。

}
}
}
}
else
{
AfxMessageBox("只支持256色和真彩色位图">。

// 释放内存
GlobalUnlock(hDIB>。

GlobalFree(hDIB>。

return NULL。

}
// 返回
return hDIB。

}
/*************************************************************************
*
* 函数名称:
* ZoomDIB(>
*
* 参数:
* LPSTR lpDIB - 指向源DIB地指针
* float fXZoomRatio - X轴方向缩放比率
* float fYZoomRatio - Y轴方向缩放比率
*
* 返回值:
* HGLOBAL - 缩放成功返回新DIB句柄,否则返回NULL.
*
* 说明:
* 该函数用来缩放DIB图像,返回新生成DIB地句柄.
*
************************************************************************/ HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio> {
// 源图像地宽度和高度
LONG lWidth。

LONG lHeight。

// 缩放后图像地宽度和高度
LONG lNewWidth。

LONG lNewHeight。

WORD wNumColors。

// 缩放后图像地宽度<lNewWidth',必须是4地倍数)
LONG lNewLineBytes。

// 指向源图像地指针
LPBYTE lpDIBBits。

// 指向源象素地指针
LPBYTE lpSrc。

// 缩放后新DIB句柄
HDIB hDIB。

// 指向缩放图像对应象素地指针
LPBYTE lpDst。

// 指向缩放图像地指针
LPSTR lpNewDIB。

LPBYTE lpNewDIBBits。

// 指向BITMAPINFO结构地指针<Win3.0)
LPBITMAPINFOHEADER lpbmi,lpbmi0。

// 指向BITMAPCOREINFO结构地指针
LPBITMAPCOREHEADER lpbmc。

// 循环变量<象素在新DIB中地坐标)
LONG i。

LONG j。

// 象素在源DIB中地坐标
LONG i0。

LONG j0。

// 图像每行地字节数
LONG lLineBytes。

// 找到源DIB图像象素起始位置
lpDIBBits = (LPBYTE>::FindDIBBits(lpDIB>。

// 获取图像地宽度
lWidth = ::DIBWidth(lpDIB>。

// 获取图像地高度
lHeight = ::DIBHeight(lpDIB>。

wNumColors= ::DIBNumColors(lpDIB>。

lpbmi0=(LPBITMAPINFOHEADER>lpDIB。

// 计算图像每行地字节数
lLineBytes = WIDTHBYTES(lWidth * (lpbmi0->biBitCount>>。

// 计算缩放后地图像实际宽度
// 此处直接加0.5是因为强制类型转换时不四舍五入,而是直接截去小数部分
lNewWidth = (LONG> (lWidth* fXZoomRatio + 0.5>。

// 计算新图像每行地字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * (lpbmi0->biBitCount>>。

// 计算缩放后地图像高度
lNewHeight = (LONG> (lHeight * fYZoomRatio + 0.5>。

// 分配内存,以保存新DIB
hDIB = (HDIB> ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD>lpDIB + ::PaletteSize(lpDIB>>。

// 判断是否内存分配失败
if (hDIB == NULL>
{
// 分配内存失败
return NULL。

}
// 锁定内存
lpNewDIB = (LPSTR>::GlobalLock((HGLOBAL> hDIB>。

// 复制DIB信息头和调色板
memcpy(lpNewDIB, lpDIB, *(LPDWORD>lpDIB + ::PaletteSize(lpDIB>>。

// 找到新DIB象素起始位置
lpNewDIBBits = (LPBYTE>::FindDIBBits(lpNewDIB>。

// 获取指针
lpbmi = (LPBITMAPINFOHEADER>lpNewDIB。

lpbmc = (LPBITMAPCOREHEADER>lpNewDIB。

// 更新DIB中图像地高度和宽度
if (IS_WIN30_DIB(lpNewDIB>>
{
// 对于Windows 3.0 DIB
lpbmi->biWidth = lNewWidth。

lpbmi->biHeight = lNewHeight。

}
else
{
// 对于其它格式地DIB
lpbmc->bcWidth = (unsigned short> lNewWidth。

lpbmc->bcHeight = (unsigned short> lNewHeight。

}
if(wNumColors==256>
{
// 针对图像每行进行操作
for(i = 0。

i < lNewHeight。

i++>
{
// 针对图像每列进行操作
for(j = 0。

j < lNewWidth。

j++>
{
// 指向新DIB第i行,第j个象素地指针
// 注意此处宽度和高度是新DIB地宽度和高度
lpDst = (LPBYTE>lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i> + j。

// 计算该象素在源DIB中地坐标
i0 = (LONG> (i / fYZoomRatio + 0.5>。

j0 = (LONG> (j / fXZoomRatio + 0.5>。

// 判断是否在源图范围内
if( (j0 >= 0> && (j0 < lWidth> && (i0 >= 0> && (i0 < lHeight>>
{
// 指向源DIB第i0行,第j0个象素地指针
lpSrc = (LPBYTE>lpDIBBits + lLineBytes * (lHeight - 1 - i0> + j0。

// 复制象素
*lpDst = *lpSrc。

}
else
{
// 对于源图中没有地象素,直接赋值为255
* ((LPBYTE>lpDst> = 255。

}
}
}
}
else if(wNumColors==0>
{for(i = 0。

i < lNewHeight。

i++>
{
// 针对图像每列进行操作
for(j = 0。

j < lNewWidth。

j++>
{
// 指向新DIB第i行,第j个象素地指针
// 注意此处宽度和高度是新DIB地宽度和高度
lpDst = (LPBYTE>lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i> + 3*j。

// 计算该象素在源DIB中地坐标
i0 = (LONG> (i / fYZoomRatio + 0.5>。

j0 = (LONG> (j / fXZoomRatio + 0.5>。

// 判断是否在源图范围内
if( (j0 >= 0> && (j0 < lWidth> && (i0 >= 0> && (i0 < lHeight>>
{
// 指向源DIB第i0行,第j0个象素地指针
lpSrc = (LPBYTE>lpDIBBits + lLineBytes * (lHeight - 1 - i0> + 3*j0。

// 复制象素
memcpy(lpDst,lpSrc,3>。

}
else
{
// 对于源图中没有地象素,直接赋值为255
memset(lpDst,255,3>。

}
}
}
}
// 返回
return hDIB。

}
/*************************************************************************
*
* 函数名称:
* On256tograyscale (>
*
* 说明:
* 该算法函数用来把256图像转化成灰度图像.
*
************************************************************************/
void CCimageProcessingView::On256tograyscale(>
{
// TODO: Add your command handler code here
// 获取文档指针
CCimageProcessingDoc* pDoc = GetDocument(>。

// 指向DIB地指针
LPSTR lpDIB。

// 指向DIB象素指针
LPSTR lpDIBBits。

// 指向DIB地一个象素地指针
BYTE * l pSrc。

// 颜色表中地颜色数目
WORD wNumColors。

// 灰度映射表
BYTE bGrayMap[256]。

//调色板索应循环变量
LONG i。

// 图象高度循环变量
LONG ih。

//图象宽度循环变量
LONG iw。

// 图像宽度
LONG lWidth。

// 图像高度
LONG lHeight。

// 图像每行地字节数
LONG OneLineBytes。

// 指向BITMAPINFO结构地指针<Win3.0)
LPBITMAPINFO lpbmi。

// 指向BITMAPCOREINFO结构地指针(OS/2>
LPBITMAPCOREINFO lpbmc。

// 表明是否是Win3.0 DIB地标记
BOOL bWin30DIB。

lpDIB = (LPSTR> ::GlobalLock((HGLOBAL> pDoc->GetHDIB(>>。

// 获取指向BITMAPINFO结构地指针<Win3.0)
lpbmi = (LPBITMAPINFO>lpDIB。

// 获取指向BITMAPCOREINFO结构地指针(OS/2>
lpbmc = (LPBITMAPCOREINFO>lpDIB。

// 锁定DIB
// 获取DIB中颜色表中地颜色数目
wNumColors = ::DIBNumColors(lpDIB>。

// 判断是否是256色位图
if (wNumColors != 256>
{
MessageBox("不是256色位图!">。

// 解除锁定
::GlobalUnlock((HGLOBAL> pDoc->GetHDIB(>>。

// 返回
return。

}
// 更改光标形状
BeginWaitCursor(>。

// 判断是否是WIN3.0地DIB
bWin30DIB = IS_WIN30_DIB(lpDIB>。

//将原图象地调色板转化为灰度调色板
//建立原调色板索引与灰度调色板索引地映射关系
for (i = 0。

i < 256。

i ++>
{
if (bWin30DIB>
{
//对原256色调色板地每一表项计算对应地灰度值
bGrayMap[i] = (BYTE>(0.299 * lpbmi->bmiColors[i].rgbRed +
0.587 * lpbmi->bmiColors[i].rgbGreen +
0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5>。

// 建立灰度调色板
//红色分量
lpbmi->bmiColors[i].rgbRed = i。

// 绿色分量
lpbmi->bmiColors[i].rgbGreen = i。

// 蓝色分量
lpbmi->bmiColors[i].rgbBlue = i。

// 保留位
lpbmi->bmiColors[i].rgbReserved = 0。

}
else
{
//对原256色调色板地每一表项计算对应地灰度值
bGrayMap[i] = (BYTE>(0.299 * lpbmc->bmciColors[i].rgbtRed +
0.587 * lpbmc->bmciColors[i].rgbtGreen +
0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5>。

//建立灰度调色板
// 红色分量
lpbmc->bmciColors[i].rgbtRed = i。

// 绿色分量
lpbmc->bmciColors[i].rgbtGreen = i。

// 蓝色分量
lpbmc->bmciColors[i].rgbtBlue = i。

}
}
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB>。

// 获取图像宽度
lWidth = ::DIBWidth(lpDIB>。

// 获取图像高度
lHeight = ::DIBHeight(lpDIB>。

// 计算图像每行地字节数
OneLineBytes = WIDTHBYTES(lWidth * 8>。

// 更换原256色位图地每个象素地颜色索引
// 每行
for(ih = 0。

ih < lHeight。

ih++>
{
// 每列
for(iw= 0。

iw < lWidth。

iw++>
{
// 指向DIB第ih行,第iw列地象素地指针
lpSrc = (BYTE*>lpDIBBits + OneLineBytes * (lHeight - 1 - ih> +iw。

//对256色位图,其像素值是调色板索引值
//对灰度图,索引值就等于其灰度值
//映射调色板索引
*lpSrc = bGrayMap[*lpSrc]。

}
}
// 替换当前调色板为灰度调色板
pDoc->GetDocPalette(>->SetPaletteEntries(0,256,
(LPPALETTEENTRY>lpbmi->bmiColors>。

// 设置脏标记
pDoc->SetModifiedFlag(TRUE>。

// 实现新地调色板
OnDoRealize((WPARAM>m_hWnd,0>。

// 更新视图
pDoc->UpdateAllViews(NULL>。

// 解除锁定
::GlobalUnlock((HGLOBAL> pDoc->GetHDIB(>>。

// 恢复光标
EndWaitCursor(>。

}
/*************************************************************************
*
* 函数名称:
*
* RandomNoise(>
*
* 参数:
*
* LPSTR lpDIB // 指向源DIB图像指针
*
* 返回值:
*
* BOOL // 加入随机噪声操作成功返回TRUE,否则返回FALSE.
*
* 说明:
*
* 该函数用来对256色位图和24位真彩色位图进行加入随即噪声操作.
*
************************************************************************/ BOOL WINAPI RandomNoise (LPSTR lpDIB>
{
// 图像宽度和高度
LONG lWidth,lHeight。

// 指向图像像素地指针
LPSTR lpDIBBits。

// 指向源图像地指针
LPSTR lpSrc。

//循环变量
long i。

long j。

// 图像每行地字节数
LONG lLineBytes。

//指向图像信息头结构地指针
LPBITMAPINFOHEADER lpbmi。

//图像地颜色数
WORD wNumColors。

//噪声
BYTE NoiseValue。

// 计算图像每行地字节数
lpbmi=(LPBITMAPINFOHEADER>lpDIB。

//计算图像地高度和宽度
lWidth=::DIBWidth(lpDIB>。

lHeight=::DIBHeight(lpDIB>。

//找到图像像素地起始位置
lpDIBBits=::FindDIBBits(lpDIB>。

//计算图像地颜色数
wNumColors=::DIBNumColors(lpDIB>。

//计算图像每行地字节数
lLineBytes = WIDTHBYTES(lWidth * lpbmi->biBitCount>。

//生成伪随机种子
srand((unsigned>time(NULL>>。

//在图像中加噪
//如果是256色位图
if(wNumColors==256>
{
for (j = 0。

j < lHeight 。

j++>
{
for(i = 0。

i < lWidth 。

i++>
{
//随机地噪声值
NoiseValue=rand(>/1024。

// 指向源图像倒数第j行,第i个象素地指针
lpSrc = (char *>lpDIBBits + lLineBytes * j + i。

//在像素值中加入噪声值
*lpSrc = (BYTE>(((BYTE>*(lpSrc>>*224/256 + NoiseValue>。

}
}
}
//如果是24位真彩色位图
else if(wNumColors==0>
{
for (j = 0。

j < lHeight 。

j++>
{
for(i = 0。

i < lWidth 。

i++>
{
NoiseValue=rand(>/1024。

// 指向源图像倒数第j行,第i个象素地指针
lpSrc = (char *>lpDIBBits + lLineBytes * j + 3*i。

//在每个像素地RGB分量中加入随机地噪声值
*lpSrc++ = (BYTE>(((BYTE>*(lpSrc++>>*224/256 + NoiseV alue>。

*lpSrc++ = (BYTE>(((BYTE>*(lpSrc++>>*224/256 + NoiseV alue>。

*lpSrc++ = (BYTE>(((BYTE>*(lpSrc++>>*224/256 + NoiseV alue>。

}
}
}
//如果既不是256色位图也不是24 位真彩色位图,直接返回
else
{
AfxMessageBox("只支持256色位图和24位真彩色位图">。

return false。

}
// 返回
return true。

}
/*************************************************************************
*
* 函数名称:
*
* AdjustBrightness (>
*
* 参数:
*
* LPSTR lpDIB // 指向源DIB图像指针
*
*int db
*
* BOOL //操作成功返回TRUE,否则返回FALSE.
*
* 说明:
*
* 该算法函数用来对256色位图和24位真彩色位图进行亮度调整操作.
*
************************************************************************/ BOOL WINAPI AdjustBrightness(LPSTR lpDIB, int db>
{
BYTE r, g, b。

BITMAPINFO *pbmi。

WORD wNumColors。

LONG i。

LPSTR lpDIBBits。

int nDelta。

int iWidth, iHeight。

if (lpDIB == NULL>
return FALSE。

pbmi = (BITMAPINFO *>lpDIB。

if (! pbmi>
return FALSE。

wNumColors =::DIBNumColors(lpDIB>。

if (wNumColors==256>
{
for (i=0。

i<wNumColors。

i++>
{
pbmi->bmiColors[i].rgbRed = BOUND(pbmi->bmiColors[i].rgbRed+db, 0, 255>。

pbmi->bmiColors[i].rgbGreen = BOUND(pbmi->bmiColors[i].rgbGreen+db, 0, 255>。

pbmi->bmiColors[i].rgbBlue = BOUND(pbmi->bmiColors[i].rgbBlue+db, 0, 255>。

}
}
else if(wNumColors==0>
{
lpDIBBits= ::FindDIBBits(lpDIB>。

nDelta = WIDTHBYTES((pbmi->bmiHeader.biBitCount>*(pbmi->bmiHeader.biWidth>>
- ((pbmi->bmiHeader.biWidth>*(pbmi->bmiHeader.biBitCount>+7>/8。

for (iHeight=0。

iHeight<pbmi->bmiHeader.biHeight。

iHeight++>
{
for (iWidth=0。

iWidth<pbmi->bmiHeader.biWidth。

iWidth++>
{
b = (BYTE>*(lpDIBBits>。

g = (BYTE>*(lpDIBBits+1>。

r = (BYTE>*(lpDIBBits+2>。

*lpDIBBits++= BOUND(b+db, 0, 255>。

*lpDIBBits++= BOUND(g+db, 0, 255>。

*lpDIBBits++= BOUND(r+db, 0, 255>。

}
lpDIBBits += nDelta。

}
}
else
{
AfxMessageBox("只处理256色和24位位图">。

return false。

}
return TRUE。

}
/************************************************************************* *
* 函数名称:
*
* AdjustColor (>
*
* 参数:
*
* LPSTR lpDIB // 指向源DIB图像指针
*
*int dr dg db
*
* BOOL //操作成功返回TRUE,否则返回FALSE.
*
* 说明:
*
* 该算法函数用来对256色位图和24位真彩色位图进行色调调整操作.
*
************************************************************************/ BOOL WINAPI AdjustColor(LPSTR lpDIB, int dr, int dg, int db>
{
BYTE r, g, b。

BITMAPINFO *pbmi。

WORD wNumColors。

LONG i。

LPSTR lpDIBBits。

int iWidth, iHeight。

if (lpDIB == NULL>
return FALSE。

pbmi = (BITMAPINFO *>lpDIB。

if (! pbmi>
return FALSE。

wNumColors =::DIBNumColors(lpDIB>。

if (wNumColors==256>
{
for (i=0。

i<wNumColors。

i++>
{
pbmi->bmiColors[i].rgbRed = BOUND(pbmi->bmiColors[i].rgbRed+dr, 0, 255>。

pbmi->bmiColors[i].rgbGreen = BOUND(pbmi->bmiColors[i].rgbGreen+dg, 0, 255>。

pbmi->bmiColors[i].rgbBlue = BOUND(pbmi->bmiColors[i].rgbBlue+db, 0, 255>。

}
}
else if(wNumColors==0>
{
lpDIBBits= ::FindDIBBits(lpDIB>。

nDelta = WIDTHBYTES((pbmi->bmiHeader.biBitCount>*(pbmi->bmiHeader.biWidth>>
- ((pbmi->bmiHeader.biWidth>*(pbmi->bmiHeader.biBitCount>+7>/8。

for (iHeight=0。

iHeight<pbmi->bmiHeader.biHeight。

iHeight++>
{
for (iWidth=0。

iWidth<pbmi->bmiHeader.biWidth。

iWidth++>
{
b = (BYTE>*(lpDIBBits>。

g = (BYTE>*(lpDIBBits+1>。

r = (BYTE>*(lpDIBBits+2>。

*lpDIBBits++= BOUND(b+db, 0, 255>。

*lpDIBBits++= BOUND(g+dg, 0, 255>。

*lpDIBBits++= BOUND(r+dr, 0, 255>。

}
lpDIBBits += nDelta。

}
}
else
{
AfxMessageBox("只处理256色和24位位图">。

}
return TRUE。

}
/************************************************************************* *
* 函数名称:
*
* AdjustCotrast (>
*
* 参数:
*
* LPSTR lpDIB // 指向源DIB图像指针
*
*int dc
*
* BOOL //操作成功返回TRUE,否则返回FALSE.
*
* 说明:
*
* 该算法函数用来对256色位图和24位真彩色位图进行对比度调整操作.
*
************************************************************************/ BOOL WINAPI AdjustCotrast(LPSTR lpDIB, int dc>
{
BYTE r, g, b。

BITMAPINFO *pbmi。

WORD wNumColors。

LONG i。

LPSTR lpDIBBits。

int nDelta。

int iWidth, iHeight。

if (lpDIB == NULL>
return FALSE。

pbmi = (BITMAPINFO *>lpDIB。

if (! pbmi>
return FALSE。

wNumColors =::DIBNumColors(lpDIB>。

if (wNumColors==256>
{
for (i=0。

i<wNumColors。

i++>
{
if(dc>=0>
{
int vMin=dc。

int vMax=255-dc。

float Grad=((float>(vMax-vMin>>/255。

IncreaseContrast(&(pbmi-
>bmiColors[i].rgbRed>,vMin,vMax,Grad>。

IncreaseContrast(&(pbmi->bmiColors[i].rgbGreen>,vMin,vMax,Grad>。

IncreaseContrast(&(pbmi-
>bmiColors[i].rgbBlue>,vMin,vMax,Grad>。

}
else
{
float Grad=255/(255+2*(float>dc>。

DecreaseContrast(&(pbmi->bmiColors[i].rgbRed>,dc,Grad>。

DecreaseContrast(&(pbmi-
>bmiColors[i].rgbGreen>,dc,Grad>。

DecreaseContrast(&(pbmi->bmiColors[i].rgbBlue>,dc,Grad>。

}
}
}
else if(wNumColors==0>
{
lpDIBBits= ::FindDIBBits(lpDIB>。

nDelta = WIDTHBYTES((pbmi->bmiHeader.biBitCount>*(pbmi->bmiHeader.biWidth>>
- ((pbmi->bmiHeader.biWidth>*(pbmi->bmiHeader.biBitCount>+7>/8。

for (iHeight=0。

iHeight<pbmi->bmiHeader.biHeight。

iHeight++>
{
for (iWidth=0。

iWidth<pbmi->bmiHeader.biWidth。

iWidth++>
{
b = (BYTE>*(lpDIBBits>。

g = (BYTE>*(lpDIBBits+1>。

r = (BYTE>*(lpDIBBits+2>。

if(dc>=0>
{
int vMin=dc。

int vMax=255-dc。

float Grad=((float>(vMax-vMin>>/255。

IncreaseContrast(&b,vMin,vMax,Grad>。

IncreaseContrast(&g,vMin,vMax,Grad>。

IncreaseContrast(&r,vMin,vMax,Grad>。

}
else
{
float Grad=255/(255+2*(float>dc>。

DecreaseContrast(&b,dc,Grad>。

DecreaseContrast(&g,dc,Grad>。

DecreaseContrast(&r,dc,Grad>。

}
*lpDIBBits++= b。

*lpDIBBits++= g。

*lpDIBBits++= r。

}
lpDIBBits += nDelta。

}
}
else
{
AfxMessageBox("只处理256色和24位位图">。

return false。

}
return TRUE。

}。

相关文档
最新文档