《Visual C实践与提高―数字图像处理与工程应用篇》_第1页
《Visual C实践与提高―数字图像处理与工程应用篇》_第2页
《Visual C实践与提高―数字图像处理与工程应用篇》_第3页
《Visual C实践与提高―数字图像处理与工程应用篇》_第4页
《Visual C实践与提高―数字图像处理与工程应用篇》_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章图像的几何变换数字图像平移图像平移函数/* 函数名称:Translation(LPSTR lpSrcStartBits, long lWidth, long lHeight, long lXOffset,long lYOffset,long lLineBytes,long lDstLineBytes* 函数参数:* LPSTR lpSrcStartBits,指向源DIB起始像素的指针* long lWidth,DIB图象的宽度* long lHeight,DIB图象的高度* long lXOffset,X方向偏移量* long lYOffset,Y方向偏移量* long lLineByt

2、es,DIB图象的行字节数,为4的倍数* long lDstLineBytes,临时DIB图象的行字节数,为4的倍数* 函数类型:BOOL* 函数功能:该函数用来平移DIB图象*/ BOOL Translation(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lXOffset, long lYOffset,long lLineBytes,long lDstLineByteslong i; /行循环变量long j; /列循环变量LPSTR lpSrcDIBBits; /指向源像素的指针LPSTR lpDstDIBBits; /指向临

3、时图象对应像素的指针LPSTR lpDstStartBits; /指向临时图象对应像素的指针HLOCAL hDstDIBBits; /临时图象句柄hDstDIBBits= LocalAlloc(LHND, lWidth * lDstLineBytes;/ 分配临时内存lpDstStartBits= (char * LocalLock(hDstDIBBits;/ 锁定内存if (hDstDIBBits= NULL/ 判断是否内存分配return FALSE;/ 分配内存失败for(i = 0; i < lHeight; i+/ 行for(j = 0; j < lWidth; j+ /

4、 列lpDstDIBBits=(char*lpDstStartBits+lLineBytes*(lHeight-1-i+j;/ 指向新DIB第i行,第j个像素的指针if( (j-lYOffset>= 0 && (j-lYOffset< lWidth && / 像素在源DIB中的坐标j-lXOffset (i-lXOffset>= 0 && (i-lXOffset < lHeight/ 判断是否在源图范围内lpSrcDIBBits=(char *lpSrcStartBits+lLineBytes*(lHeight-1-(i-

5、lXOffset+(j-lYOffset;/ 指向源DIB第i0行,第j0个像素的指针*lpDstDIBBits= *lpSrcDIBBits;/ 复制像素else* (unsigned char*lpDstDIBBits = 255;/ 源图中没有的像素,赋为255 memcpy(lpSrcStartBits, lpDstStartBits, lLineBytes * lHeight;/ 复制图象LocalUnlock(hDstDIBBits;/ 释放内存LocalFree(hDstDIBBits;return TRUE;该函数调用函数CDImagePorcess View视图类的/图像平移

6、void CDImageProcessView:OnTranslation(/ TODO: Add your command handler code hereCDImageProcessDoc* pDoc = GetDocument(;/long lSrcLineBytes; /图象每行的字节数long lSrcWidth; /图象的宽度和高度long lSrcHeight;LPSTR lpSrcDib; /指向源图象的指针LPSTR lpSrcStartBits; /指向源像素的指针long lDstLineBytes; /新图象每行的字节数lpSrcDib= (LPSTR :Global

7、Lock(HGLOBAL pDoc->GetHObject(;/ 锁定DIBif (pDoc->m_dib.GetColorNum(lpSrcDib != 256/ 判断是否是8-bpp位图AfxMessageBox("对不起,不是256色位图!"/ 警告:GlobalUnlock(HGLOBAL pDoc->GetHObject(;/ 解除锁定return; /返回 /判断是否是8-bpp位图,不是则返回lpSrcStartBits=pDoc->m_dib.GetBits(lpSrcDib; / 找到DIB图象像素起始位置lSrcWidth= pD

8、oc->m_dib.GetWidth(lpSrcDib; / 获取图象的宽度lSrcHeight= pDoc->m_dib.GetHeight(lpSrcDib; / 获取图象的高度lSrcLineBytes=pDoc->m_dib.GetReqByteWidth(lSrcWidth * 8; / 计算图象每行的字节数/ lDstLineBytes=pDoc->m_dib.GetReqByteWidth(lSrcHeight * 8; / 计算新图象每行的字节数CDlgTran TranPara;/ 创建对话框if (TranPara.DoModal( != IDOK/

9、 显示对话框,提示用户设定量return;int temver=TranPara.m_verOff;int temhor=TranPara.m_horOff;if (Translation(lpSrcStartBits, lSrcWidth,lSrcHeight,/ 调用Translation(函数平移DIB temver,temhor,lSrcLineBytes,lDstLineBytespDoc->SetModifiedFlag(TRUE; / 设置脏标记pDoc->UpdateAllViews(NULL; / 更新视图:GlobalUnlock(HGLOBAL pDoc-&g

10、t;GetHObject(; / 解除锁定elseAfxMessageBox(_T("分配内存失败!"/警告数字图像旋转图像旋转函数/* 函数名称:Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight,long lLineBytes, WORD palSize, long lDstWidth,long lDstHeight,long lDstLineBytes,float fSina, float fCosa* 函数参数:* LPSTR lpSrcDib,指向源DIB的指针* LPSTR

11、lpSrcStartBits,指向源DIB的起始像素的指针* long lWidth,源DIB图象宽度* long lHeight,源DIB图象高度* long lLineBytes,源DIB图象字节宽度(4的倍数* WORD palSize,源DIB图象调色板大小* long lDstWidth,目标图象宽度* long lDstHeight,目标DIB图象高度* long lDstLineBytes,目标DIB图象行字节数(4的倍数* float fSina,旋转角的余弦,说明:为了避免两次求取正余弦,这里作为两个函数参数来用* float fCosa,旋转角的正弦* 函数类型:HGLOB

12、AL* 函数功能:用来旋转DIB图象*/ HGLOBAL Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight,long lLineBytes, WORD palSize, long lDstWidth,long lDstHeight,long lDstLineBytes,float fSina, float fCosafloat varFloat1; /浮点参数变量1float varFloat2; /浮点参数变量2LPSTR lpDstDib; /指向临时图象的指针long i; /行循环变量long j

13、; /列循环变量long i1; /行循环变量long j1; /列循环变量LPSTR lpSrcDIBBits; /指向源像素的指针LPSTR lpDstDIBBits; /指向临时图象对应像素的指针LPSTR lpDstStartBits; /指向临时图象对应像素的指针LPBITMAPINFOHEADER lpbmi;/ 指向BITMAPINFOHEADER结构的指针varFloat1= (float (-0.5 * (lDstWidth - 1 * fCosa - 0.5 * (lDstHeight - 1 * fSina/ 将经常用到的两个常数事先求出,以便作为常数使用+ 0.5 *

14、(lDstWidth - 1;varFloat2= (float ( 0.5 * (lDstWidth - 1 * fSina - 0.5 * (lDstHeight - 1 * fCosa+ 0.5 * (lDstHeight - 1;HGLOBAL hDIB = (HGLOBAL :GlobalAlloc(GHND, lDstLineBytes * lDstHeight + *(LPDWORDlpSrcDib +palSize;/ 分配内存,以保存新DIBif (hDIB = NULL/ 判断是否是有效的DIB对象return FALSE;/ 不是,则返回lpDstDib= (char *

15、 :GlobalLock(HGLOBAL hDIB;/ 锁定内存memcpy(lpDstDib,lpSrcDib, *(LPDWORDlpSrcDib +palSize;/ 复制DIB信息头和调色板lpbmi = (LPBITMAPINFOHEADERlpDstDib;/ 获取指针lpbmi->biHeight=lDstHeight;/ 更新DIB中图象的高度和宽度lpbmi->biWidth =lDstWidth;lpDstStartBits=lpDstDib+ *(LPDWORDlpDstDib+palSize;/ 求像素起始位置,作用如同:FindDIBBits(gCo.lp

16、SrcDib,这里尝试使用了这种方法,以避免对全局函数的调用for(i = 0; i < lDstHeight; i+/ 行操作for(j = 0; j < lDstWidth; j+/ 列操作lpDstDIBBits= (char *lpDstStartBits+ lDstLineBytes * (lDstHeight - 1 - i + j;/ 指向新DIB第i行,第j个像素的指针i1= (long (-(float j * fSina + (float i * fCosa + varFloat2 + 0.5;/ 计算该像素在源DIB中的坐标j1= (long ( (float

17、 j * fCosa + (float i * fSina + varFloat1 + 0.5;if( (j1>= 0 && (j1< lWidth && (i1>= 0 && (i1< lHeight/ 判断是否在源图内lpSrcDIBBits= (char *lpSrcStartBits+ lLineBytes * (lHeight - 1 -i1 + j1;/ 指向源DIB第i0行,第j0个像素的指针*lpDstDIBBits= *lpSrcDIBBits;/ 复制像素else* (unsigned char*lpD

18、stDIBBits = 255;/ 源图中不存在的像素,赋为255 return hDIB;该函数调用函数CDImagePorcess View视图类的/图像旋转void CDImageProcessView:OnRotation(/ TODO: Add your command handler code hereCDImageProcessDoc* pDoc = GetDocument(;/long lSrcLineBytes; /图象每行的字节数long lSrcWidth; /图象的宽度和高度long lSrcHeight;LPSTR lpSrcDib; /指向源图象的指针LPSTR l

19、pSrcStartBits; /指向源像素的指针long lDstWidth; /临时图象的宽度和高度long lDstHeight;lpSrcDib= (LPSTR :GlobalLock(HGLOBAL pDoc->GetHObject(;/ 锁定DIBif (pDoc->m_dib.GetColorNum(lpSrcDib != 256/ 判断是否是8-bpp位图AfxMessageBox("对不起,不是256色位图!"/ 警告:GlobalUnlock(HGLOBAL pDoc->GetHObject(;/ 解除锁定return; /返回 /判断是

20、否是8-bpp位图,不是则返回lpSrcStartBits=pDoc->m_dib.GetBits(lpSrcDib; / 找到DIB图象像素起始位置lSrcWidth= pDoc->m_dib.GetWidth(lpSrcDib; / 获取图象的宽度lSrcHeight= pDoc->m_dib.GetHeight(lpSrcDib; / 获取图象的高度lSrcLineBytes=pDoc->m_dib.GetReqByteWidth(lSrcWidth * 8; / 计算图象每行的字节数long lDstLineBytes;/ CDlgRot RotPara;/ 创

21、建对话框if(RotPara.DoModal( != IDOK/ 显示对话框,设定旋转角度return;DWORD palSize=pDoc->m_dib.GetPalSize(lpSrcDib;float fRotateAngle = (float AngleToRadian(RotPara.m_rotAngle;/ 将旋转角度从度转换到弧度float fSina = (float sin(doublefRotateAngle;/ 计算旋转角度的正余弦float fCosa = (float cos(doublefRotateAngle;float fSrcX1,fSrcY1,fSrc

22、X2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;/ 旋转前四个角的坐标(以图象中心为坐标系原点float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;/ 旋转后四个角的坐标(以图象中心为坐标系原点fSrcX1 = (float (- (lSrcWidth - 1 / 2;/ 计算原图的四个角的坐标fSrcY1 = (float ( (lSrcHeight - 1 / 2;fSrcX2 = (float ( (lSrcWidth - 1 / 2;fSrcY2 = (float ( (lSrcHeigh

23、t - 1 / 2;fSrcX3 = (float (- (lSrcWidth - 1 / 2;fSrcY3 = (float (- (lSrcHeight - 1 / 2;fSrcX4 = (float ( (lSrcWidth - 1 / 2;fSrcY4 = (float (- (lSrcHeight - 1 / 2;fDstX1 = fCosa * fSrcX1 + fSina * fSrcY1;/ 计算新图四个角的坐标fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1;fDstX2 = fCosa * fSrcX2 + fSina * fSrcY2;f

24、DstY2 = -fSina * fSrcX2 + fCosa * fSrcY2;fDstX3 = fCosa * fSrcX3 + fSina * fSrcY3;fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3;fDstX4 = fCosa * fSrcX4 + fSina * fSrcY4;fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4;lDstWidth= (long ( max( fabs(fDstX4 - fDstX1, fabs(fDstX3 - fDstX2 + 0.5;/ 计算旋转后的图象实际宽度lDstLi

25、neBytes=pDoc->m_dib.GetReqByteWidth(lDstWidth * 8;/ 计算新图象每行的字节数lDstHeight= (long ( max( fabs(fDstY4 - fDstY1, fabs(fDstY3 - fDstY2 + 0.5;/ 计算旋转后的图象高度HGLOBAL hDstDIB = NULL;/ 创建新DIBhDstDIB = (HGLOBAL Rotate(lpSrcDib,lpSrcStartBits,lSrcWidth,lSrcHeight,lSrcLineBytes, palSize,lDstWidth,lDstHeight,lD

26、stLineBytes,fSina,fCosa;/ 调用Rotate(函数旋转DIBif(hDstDIB != NULL/ 判断旋转是否成功pDoc->UpdateObject(hDstDIB;/ 替换DIB,同时释放旧DIB对象pDoc->SetDib(;/ 更新DIB大小和调色板pDoc->SetModifiedFlag(TRUE; / 设置脏标记pDoc->UpdateAllViews(NULL; / 更新视图:GlobalUnlock(HGLOBAL pDoc->GetHObject(; / 解除锁定elseAfxMessageBox(_T("分

27、配内存失败!"/ 警告数字图像缩放图像缩放函数/* 函数名称:Zoom(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight,long lLineBytes, WORD palSize, long lDstWidth,long lDstHeight,long lDstLineBytes,float fXZoomRatio, float fYZoomRatio * 函数参数:* LPSTR lpSrcDib,指向源DIB的指针* LPSTR lpSrcStartBits,指向源DIB的起始像素的指针* long l

28、Width,源DIB图象宽度* long lHeight,源DIB图象高度* long lLineBytes,源DIB图象字节宽度(4的倍数* WORD palSize,源DIB图象调色板大小* long lDstWidth,目标图象宽度* long lDstHeight,目标DIB图象高度* long lDstLineBytes,目标DIB图象行字节数(4的倍数* float fhorRatio,水平缩放比率* float fverRatio,垂直缩放比率* 函数类型:HGLOBAL* 函数功能:用来缩放DIB图象*/HGLOBAL Zoom(LPSTR lpSrcDib, LPSTR lp

29、SrcStartBits,long lWidth, long lHeight,long lLineBytes, WORD palSize,long lDstWidth,long lDstLineBytes,long lDstHeight,float fhorRatio,float fverRatioLPSTR lpDstDib; /指向临时图象的指针long i; /行循环变量long j; /列循环变量long i1; /行循环变量long j1; /列循环变量LPSTR lpSrcDIBBits; /指向源像素的指针LPSTR lpDstDIBBits; /指向临时图象对应像素的指针LPS

30、TR lpDstStartBits; /指向临时图象对应像素的指针LPBITMAPINFOHEADER lpbmi;/ 指向BITMAPINFO结构的指针/ 分配内存,以保存缩放后的DIBHGLOBAL hDIB = (HGLOBAL :GlobalAlloc(GHND, lDstLineBytes* lDstHeight + *(LPDWORDlpSrcDib +palSize;if (hDIB = NULL/ 判断是否是有效的DIB对象return FALSE;/ 不是,则返回lpDstDib= (char * :GlobalLock(HGLOBAL hDIB;/ 锁定内存memcpy(l

31、pDstDib, lpSrcDib, *(LPDWORDlpSrcDib +palSize;/ 复制DIB信息头和调色板lpDstStartBits=lpDstDib+ *(LPDWORDlpDstDib/ 找到新DIB像素起始位置+palSize;/ 求像素起始位置,作用如同:FindDIBBits(lpSrcDib,这里尝试使用了这种方法,以避免对全局函数的调用lpbmi = (LPBITMAPINFOHEADERlpDstDib;/ 获取指针lpbmi->biWidth = lDstWidth;/ 更新DIB中图象的高度和宽度lpbmi->biHeight =lDstHeig

32、ht;for(i = 0; i < lDstHeight; i+/ 行操作for(j = 0; j < lDstWidth; j+/ 列操作/ 指向新DIB第i行,第j个像素的指针lpDstDIBBits= (char *lpDstStartBits + lDstLineBytes * (lDstHeight-1-i+j;i1= (long (i / fverRatio + 0.5;/ 计算该像素在源DIB中的坐标j1= (long (j / fhorRatio + 0.5;if( (j1>= 0 && (j1< lWidth && (i

33、1>= 0 && (i1< lHeight/ 判断是否在源图内lpSrcDIBBits= (char *lpSrcStartBits+ lLineBytes * (lHeight - 1 -i1 + j1;/ 指向源DIB第i行,第j个像素的指针*lpDstDIBBits= *lpSrcDIBBits;/ 复制像素else* (unsigned char*lpDstDIBBits = 255;/ 源图中不存在的像素,赋为255 return hDIB;该函数调用函数CDImagePorcess View视图类的/图像缩放void CDImageProcessView

34、:OnZoom(/ TODO: Add your command handler code hereCDImageProcessDoc* pDoc = GetDocument(;/long lSrcLineBytes; /图象每行的字节数long lSrcWidth; /图象的宽度和高度long lSrcHeight;LPSTR lpSrcDib; /指向源图象的指针LPSTR lpSrcStartBits; /指向源像素的指针long lDstWidth; /临时图象的宽度和高度long lDstHeight;long lDstLineBytes;lpSrcDib= (LPSTR :Glob

35、alLock(HGLOBAL pDoc->GetHObject(;/ 锁定DIBif (pDoc->m_dib.GetColorNum(lpSrcDib != 256/ 判断是否是8-bpp位图AfxMessageBox("对不起,不是256色位图!"/ 警告:GlobalUnlock(HGLOBAL pDoc->GetHObject(;/ 解除锁定return; /返回lpSrcStartBits=pDoc->m_dib.GetBits(lpSrcDib; / 找到DIB图象像素起始位置lSrcWidth= pDoc->m_dib.GetWi

36、dth(lpSrcDib; / 获取图象的宽度lSrcHeight= pDoc->m_dib.GetHeight(lpSrcDib; / 获取图象的高度lSrcLineBytes=pDoc->m_dib.GetReqByteWidth(lSrcWidth * 8; / 计算图象每行的字节数/ DWORD palSize=pDoc->m_dib.GetPalSize(lpSrcDib;CDlgZoom ZoomPara;/ 创建对话框,设定平移量if (ZoomPara.DoModal( != IDOKreturn;float fX = ZoomPara.m_horZoom;/

37、 获取设定的平移量,缩放比率float fY = ZoomPara.m_verZoom;lDstWidth= (long (lSrcWidth*fX + 0.5;/ 计算缩放后的图象实际宽度,加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分lDstLineBytes=pDoc->m_dib.GetReqByteWidth(lDstWidth * 8; /转换后图象应有的行字节数,为4的倍数lDstHeight= (long (lSrcHeight * fY + 0.5;/ 计算缩放后的图象高度HGLOBAL hDstDIB = NULL;/ 创建新DIBhDstDIB = (

38、HGLOBAL Zoom(lpSrcDib,lpSrcStartBits,lSrcWidth,lSrcHeight,lSrcLineBytes,palSize,lDstWidth,lDstLineBytes,lDstHeight,fX, fY;/ 调用Zoom(函数转置DIBif(hDstDIB != NULL/ 判断旋转是否成功pDoc->UpdateObject(hDstDIB;/ 替换DIB,同时释放旧DIB对象pDoc->SetDib(;/ 更新DIB大小和调色板pDoc->SetModifiedFlag(TRUE; / 设置脏标记pDoc->UpdateAll

39、Views(NULL; / 更新视图:GlobalUnlock(HGLOBAL pDoc->GetHObject(; / 解除锁定elseAfxMessageBox(_T("分配内存失败!"/ 警告数字图像转置图像转置函数/* 函数名称:* Transpose(LPSTR lpSrcDib,LPSTR lpDibBits,long lWidth,long lHeight,long lLineBytes,long lDstLineBytes* 函数参数:* LPSTR lpSrcDib,指向源DIB的指针LPSTR lpSrcStartBits,指向DIB起始像素的指针

40、long lWidth,DIB图象的宽度long lHeight,DIB图象的高度long lLineBytes,DIB图象的行字节数,为4的倍数long lDstLineBytes,临时DIB图象的行字节数,为4的倍数* 函数类型:BOOL* 函数功能:该函数用来转置DIB图象*/BOOL Transpose(LPSTR lpSrcDib,LPSTR lpSrcStartBits,long lWidth,long lHeight,long lLineBytes,long lDstLineByteslong i; /行循环变量long j; /列循环变量LPSTR lpSrcDIBBits;

41、/指向源像素的指针LPSTR lpDstDIBBits; /指向临时图象对应像素的指针LPSTR lpDstStartBits; /指向临时图象对应像素的指针HLOCAL hDstDIBBits; /临时图象句柄LPBITMAPINFOHEADER lpbmi; / 指向BITMAPINFOHEADER结构的指针lpbmi = (LPBITMAPINFOHEADERlpSrcDib;hDstDIBBits= LocalAlloc(LHND, lWidth * lDstLineBytes;/ 分配临时内存if (hDstDIBBits= NULL / 判断是否内存分配return FALSE;

42、/ 分配内存失败lpDstStartBits= (char * LocalLock(hDstDIBBits; / 锁定内存for(i = 0; i < lHeight; i+ / 针对图象每行进行操作for(j = 0; j < lWidth; j+ / 针对图象每列进行操作lpSrcDIBBits= (char *lpSrcStartBits + lLineBytes * (lHeight - 1 - i + j;/ 指向源DIB 第i行,第j个像素的指针lpDstDIBBits= (char *lpDstStartBits + lDstLineBytes * (lWidth -

43、 1 - j + i;/ 指向转置DIB第j行,第i个像素的指针*(lpDstDIBBits= *(lpSrcDIBBits; / 复制像素memcpy(lpSrcStartBits, lpDstStartBits, lWidth * lDstLineBytes;/ 复制转置后的图象lpbmi->biWidth = lHeight;lpbmi->biHeight = lWidth;LocalUnlock(hDstDIBBits; / 释放内存LocalFree(hDstDIBBits;return TRUE; / 返回该函数调用函数CDImagePorcess View视图类的/图

44、像转置void CDImageProcessView:OnTranspose(/ TODO: Add your command handler code hereCDImageProcessDoc* pDoc = GetDocument(;/ long lSrcLineBytes; /图象每行的字节数long lSrcWidth; /图象的宽度和高度long lSrcHeight;LPSTR lpSrcDib; /指向源图象的指针LPSTR lpSrcStartBits; /指向源像素的指针long lDstLineBytes; /新图象每行的字节数lpSrcDib= (LPSTR :Glob

45、alLock(HGLOBAL pDoc->GetHObject(;/ 锁定DIBif (pDoc->m_dib.GetColorNum(lpSrcDib != 256/ 判断是否是8-bpp位图AfxMessageBox("对不起,不是256色位图!"/ 警告:GlobalUnlock(HGLOBAL pDoc->GetHObject(;/ 解除锁定return; /返回 /判断是否是8-bpp位图,不是则返回lpSrcStartBits=pDoc->m_dib.GetBits(lpSrcDib; / 找到DIB图象像素起始位置lSrcWidth=

46、pDoc->m_dib.GetWidth(lpSrcDib; / 获取图象的宽度lSrcHeight= pDoc->m_dib.GetHeight(lpSrcDib; / 获取图象的高度lSrcLineBytes=pDoc->m_dib.GetReqByteWidth(lSrcWidth * 8; / 计算图象每行的字节数/lDstLineBytes=pDoc->m_dib.GetReqByteWidth(lSrcHeight * 8; / 计算新图象每行的字节数if (Transpose(lpSrcDib,lpSrcStartBits,lSrcWidth,lSrcHe

47、ight,lSrcLineBytes,lDstLineBytes / 调用Transpose(函数转置DIB pDoc->SetDib(; / 更新DIB大小和调色板pDoc->SetModifiedFlag(TRUE; / 设置脏标记pDoc->UpdateAllViews(NULL; / 更新视图:GlobalUnlock(HGLOBAL pDoc->GetHObject(; / 解除锁定elseAfxMessageBox(_T("分配内存失败!" / 警告数字图像垂直镜像图像垂直镜像函数/* 函数名称:Mirrorchuizhi(LPSTR l

48、pSrcStartBits, long lWidth, long lHeight,long lLineBytes* 函数参数:LPSTR lpSrcStartBits,指向DIB起始像素的指针long lWidth,DIB图象的宽度long lHeight,DIB图象的高度long lLineBytes,DIB图象的行字节数,为4的倍数* 函数类型:BOOL* 函数功能:该函数用来镜像DIB图象,本程序实现垂直镜像*/BOOL Mirrorchuizhi(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineByteslong i;

49、 /行循环变量long j; /列循环变量LPSTR lpSrcDIBBits; /指向源像素的指针LPSTR lpDstDIBBits; /指向临时图象对应像素的指针HLOCAL hDstDIBBits; /临时图象句柄LPSTR lpBits; / 指向中间像素的指针,当复制图象时,提供临时的像素内存空间hDstDIBBits= LocalAlloc(LHND, lLineBytes;/ 分配临时内存保存行图象if (hDstDIBBits = NULLreturn FALSE; / 分配内存失败lpDstDIBBits= (char * LocalLock(hDstDIBBits;/ 锁

50、定for(i = 0; i < lHeight/2; i+/ 垂直镜像,针对图象每行进行操作lpSrcDIBBits= (char *lpSrcStartBits + lLineBytes * i;/ 指向倒数第i行像素起点的指针lpBits= (char *lpSrcStartBits + lLineBytes * (lHeight-i - 1 ;/ 指向第i行像素起点的指针memcpy(lpDstDIBBits,lpBits,lLineBytes;/备份一行,宽度为lWidthmemcpy(lpBits,lpSrcDIBBits,lLineBytes;/将倒数第i行像素复制到第i行m

51、emcpy(lpSrcDIBBits,lpDstDIBBits,lLineBytes;/将第i行像素复制到倒数第i行LocalUnlock(hDstDIBBits;/ 释放内存LocalFree(hDstDIBBits;return TRUE;数字图像水平镜像图像水平镜像函数/* 函数名称:Mirror(LPSTR lpSrcStartBits, long lWidth, long lHeight,long lLineBytes* 函数参数:LPSTR lpSrcStartBits,指向DIB起始像素的指针long lWidth,DIB图象的宽度long lHeight,DIB图象的高度long lLineBytes,DIB图象的行字节数,为4的倍数* 函数类型:BOOL* 函数功能:该函数用来镜像DIB图象,本程序只实现了水平镜像,垂直镜像的原理书中也谈到。很容易实现*/BOOL Mirror(LPSTR lpSrcStartBits, long lWidth,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论