1、#种常用图像处理算法函数8种常用图像处理算法 * * 参数: * * LPSTR lpDIB /指向源DIB图像指针 * * 返回值: * * BOOL /镜像成功返回TRUE,否则返回FALSE. * * 说明: * * 该函数用来实现DIB图像地垂直镜像. * */BOOL WINAPI VertMirror(LPSTR lpDIB /原图象宽度 LONG lWidth。 /原图象高度 LONG lHeight。 /原图象地颜色数 WORD wNumColors。 /原图象地信息头结构指针 LPBITMAPINFOHEADER lpbmi。 /指向原图象和目地图象地像素地指针 LPBYTE
2、 lpSrc,lpDst。 /平移后剩余图像在源图像中地位置lpDIB。 /找到图象地像素位置 lpDIBBits=(LPBYTE:FindDIBBits(lpDIB。 /获取图象地宽度 lWidth=:DIBWidth(lpDIB。 /获取图象地高度 lHeight=:DIBHeight(lpDIB。 /获取图象地颜色数 wNumColors=:DIBNumColors(lpDIB。 /计算图像每行地字节数 lLineBytes = WIDTHBYTES(lWidth *(lpbmi-biBitCount。 / 暂时分配内存,以保存新图像 h= LocalAlloc(LHND, lLineB
3、ytes。 / 分配内存失败,直接返回 if (!h return FALSE。 / 锁定内存 lpNewDIBBits = (LPBYTELocalLock(h。 /如果是256色位图或真彩色位图 if(wNumColors=256|wNumColors=0 /平移图像,每次移动一行 for(i = 0。 i /指向原图象倒数第i行像素起点地指针 lpSrc =(LPBYTElpDIBBits + lLineBytes * i。 /目标区域同样要注意上下倒置地问题 lpDst =(LPBYTElpDIBBits+lLineBytes * (lHeight-i-1 。 /备份一行 memcpy
4、(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 (
5、 * * 参数: * * 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。 /指向原图
6、象和目地图象地像素地指针 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。 /旋转前图象四个角地坐标以图象中心为坐标系原点
7、) float fSrcX1,fSrcY1,fSrcX2,fSrcY2。 float fSrcX3,fSrcY3,fSrcX4,fSrcY4。 /旋转后图象四个角地坐标:FindDIBBits(lpDIB。 /获取图象地宽度 lWidth=:DIBWidth(lpDIB。 /获取图象地高度 lHeight=:DIBHeight(lpDIB。 /获取图象地颜色数 wNumColors=:DIBNumColors(lpDIB。 /获取指向原位图信息头结构地指针 lpbmi0=(LPBITMAPINFOHEADERlpDIB。 /计算原图像每行地字节数 lLineBytes = WIDTHBYTES
8、(lWidth *(lpbmi0-biBitCount。 /将旋转角度从度转换到弧度 fArcAngle =(iAngle*PI/180.0。 /计算旋转角度地正弦 fSin = (float sin(fArcAngle。 /计算旋转角度地余弦 fCos = (float cos(fArcAngle。 /计算原图地四个角地坐标 (- (lWidth - 1 / 2。 fSrcY1 = (float ( (lHeight - 1 / 2。 fSrcX2 = (float ( (lWidth - 1 / 2。 fSrcY2 = (float ( (lHeight - 1 / 2。 fSrcX3 =
9、 (float (- (lWidth - 1 / 2。 fSrcY3 = (float (- (lHeight - 1 / 2。 fSrcX4 = (float ( (lWidth - 1 / 2。 fSrcY4 = (float (- (lHeight - 1 / 2。 /计算新图四个角地坐标 ( max( fabs(fDstX4 - fDstX1, fabs(fDstX3 - fDstX2 + 0.5。 /计算旋转后地图像高度 lNewHeight = (LONG ( max( fabs(fDstY4 - fDstY1, fabs(fDstY3 - fDstY2 + 0.5。 /计算旋转后
10、图像每行地字节数 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:GlobalAllo
11、c(GHND, lNewHeight*lNewLineBytes+ *(LPDWORDlpDIB+:PaletteSize(lpDIB。 /分配内存失败,直接返回 if (!hDIB return NULL。 /锁定内存 lpNewDIB = (LPSTR:GlobalLock(HGLOBALhDIB。 /复制DIB信息头和调色板 memcpy(lpNewDIB,lpDIB,*(LPDWORDlpDIB+:PaletteSize(lpDIB。 /获取图象地信息头结构地指针 lpbmi=(LPBITMAPINFOHEADERlpNewDIB。 /更新DIB图象地高度和宽度 lpbmi-biWid
12、th=lNewWidth。 lpbmi-biHeight=lNewHeight。 /找到新DIB像素地起始位置 lpNewDIBBits=(LPBYTE:FindDIBBits(lpNewDIB。 /如果是256色位图 if(wNumColors=256 /旋转后图像每行 for(i = 0。 i /旋转后图象每列 for(j=0。j /指向图象第i行第j个像素地指针 lpDst =(LPBYTElpNewDIBBits + lNewLineBytes * (lNewHeight-1-i+j。 /计算每个像素点在原图象中地坐标 i0 = (LONG (-(float j * fSin + (f
13、loat i * fCos + f2 + 0.5。 j0 = (LONG ( (float j * fCos + (float i * fSin + f1 + 0.5。 / 判断是否在源图象范围之内 if( (j0 = 0 & (j0 & (i0 = 0 & (i0 / 指向源DIB图象第i0行,第j0个象素地指针 lpSrc = (LPBYTElpDIBBits + lLineBytes * (lHeight - 1 - i0 + j0。 / 复制象素 *lpDst = *lpSrc。 else / 对于源图中没有地象素,直接赋值为255 * (LPBYTElpDst = 255。 /如果是
14、24位真彩色位图 else if(wNumColors=0 /旋转后图像每行 for(i = 0。 i /旋转后图象每列 for(j=0。j /指向图象第i行第j个像素地指针 lpDst =(LPBYTElpNewDIBBits + 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。 / 判断是否在源图象范
15、围之内 if( (j0 = 0 & (j0 & (i0 = 0 & (i0 / 指向源DIB图象第i0行,第j0个象素地指针 lpSrc = (LPBYTElpDIBBits + 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。 / 返回
16、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 / 源图像地宽度和高度
17、 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。 / 指
18、向BITMAPINFO结构地指针Win3.0) LPBITMAPINFOHEADER lpbmi,lpbmi0。 / 指向BITMAPCOREINFO结构地指针 LPBITMAPCOREHEADER lpbmc。 / 循环变量:FindDIBBits(lpDIB。 / 获取图像地宽度 lWidth = :DIBWidth(lpDIB。 / 获取图像地高度 lHeight = :DIBHeight(lpDIB。 wNumColors= :DIBNumColors(lpDIB。 lpbmi0=(LPBITMAPINFOHEADERlpDIB。 / 计算图像每行地字节数 lLineBytes = W
19、IDTHBYTES(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
20、:GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORDlpDIB + :PaletteSize(lpDIB。 / 判断是否内存分配失败 if (hDIB = NULL / 分配内存失败 return NULL。 / 锁定内存 lpNewDIB = (LPSTR:GlobalLock(HGLOBAL hDIB。 / 复制DIB信息头和调色板 memcpy(lpNewDIB, lpDIB, *(LPDWORDlpDIB + :PaletteSize(lpDIB。 / 找到新DIB象素起始位置 lpNewDIBBits = (LPBYTE:
21、FindDIBBits(lpNewDIB。 / 获取指针 lpbmi = (LPBITMAPINFOHEADERlpNewDIB。 lpbmc = (LPBITMAPCOREHEADERlpNewDIB。 / 更新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 =
22、(unsigned short lNewHeight。 if(wNumColors=256 / 针对图像每行进行操作 for(i = 0。 i / 针对图像每列进行操作 for(j = 0。 j / 指向新DIB第i行,第j个象素地指针 / 注意此处宽度和高度是新DIB地宽度和高度 lpDst = (LPBYTElpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i + j。 / 计算该象素在源DIB中地坐标 i0 = (LONG (i / fYZoomRatio + 0.5。 j0 = (LONG (j / fXZoomRatio + 0.5。
23、/ 判断是否在源图范围内 if( (j0 = 0 & (j0 & (i0 = 0 & (i0 / 指向源DIB第i0行,第j0个象素地指针 lpSrc = (LPBYTElpDIBBits + lLineBytes * (lHeight - 1 - i0 + j0。 / 复制象素 *lpDst = *lpSrc。 else / 对于源图中没有地象素,直接赋值为255 * (LPBYTElpDst = 255。 else if(wNumColors=0 for(i = 0。 i / 针对图像每列进行操作 for(j = 0。 j / 指向新DIB第i行,第j个象素地指针 / 注意此处宽度和高度是新DIB地宽
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1