用VC编程实现BMP图像裁切

用VC编程实现BMP图像裁切

ID:41037546

大小:36.50 KB

页数:8页

时间:2019-08-14

用VC编程实现BMP图像裁切_第1页
用VC编程实现BMP图像裁切_第2页
用VC编程实现BMP图像裁切_第3页
用VC编程实现BMP图像裁切_第4页
用VC编程实现BMP图像裁切_第5页
资源描述:

《用VC编程实现BMP图像裁切》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、5.5用VC编程实现BMP图像裁切随着计算电子技术和计算机技术的发展,数字图像处理进入高速发展时期,许多成熟的图像处理软件如雨后春笋般层出不穷。在大多数图像处理软件中都有图像裁切功能,用它能够快速提取感兴趣区域,去掉多余的图像内容。那么怎样编程实现图像裁切呢,下面以BMP图像为例介绍一下如何用VC实现图像裁切。先介绍第一种方法,将图像数据全部读入内存,然后将感兴趣区域裁切下来。在许多数字图像处理的书中都有关于BMP图像存储结构的章节,这里就不再详细介绍了。BMP文件一般分为四个部分:位图头文件、位图信息头、调色板和图像数据。图像裁切要用到位图信

2、息头中的几个参数值:biWidth(图像宽度)、biHeight(图像高度)、biBitCount(每个像素的位数)、biSizeImage(图像长度)。图像裁切首先要确定裁切区域内每个像素在整幅图像中的位置,我们以裁切区域中心点像素位置起算,要注意的是图像数据的存储是从最下面一行的左边开始的。如下图,Height是图像高,Width是图像宽,ctPoint是裁切区域中心点坐标,dwX和dwY分别是裁切区域的宽和高。以256色图像为例(每个像素占一个字节),裁切区域左下角像素(也就是裁切后图像的第一个像素)位置为(Height-ctPoint.

3、y-dwY/2-1)×Width+ctPoint.x-dwX/2,左下角像素位置确定了,裁切区域内的其他像素位置就很容易确定。确定了裁切区域内每个像素的位置后,就可以把这些像素的值赋给裁切后图像的相应像素。裁切后图像的位图信息头和调色板只要从原图像数据中拷贝就可以了,修改信息头中图像宽、高和长度值为裁切后的值。按照上面的思路笔者用VC++6.0编写了一个图像裁切函数ClipDIB(),该函数首先计算裁切区域图像数据的大小,为裁切后的图像分配内存,然后将原图像的信息头、调色板拷贝给裁切后的图像,最后将原图像中裁切区域内的像素值赋给裁切后影像。HD

4、IBCBMP_ViewView::ClipDIB(HDIBhDib,CPointctpoint,DWORDdwX,DWORDdwY){//假如图像为空则返回if(hDib==NULL){returnNULL;}//获得图像指针LPSTRlpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDib);//图像信息头指针LPBITMAPINFOHEADERlpBMIH=(LPBITMAPINFOHEADER)lpDIB;//如果裁切中心点超出图像范围if(ctpoint.x>(int)DIBWidth(lpDIB)

5、

6、ctpoin

7、t.y>(int)DIBHeight(lpDIB)){AfxMessageBox("中心点不在图像范围内");returnNULL;}DWORDdwxSave;//实际影像保存的宽度DWORDdwBitsSize;//裁切后图像区域大小if((int(ctpoint.x-dwX/2)<0)&&(int(ctpoint.y-dwY/2)<0)&&(ctpoint.x+dwX/2)>DIBWidth(lpDIB)&&(ctpoint.y+dwY/2)>DIBHeight(lpDIB)){AfxMessageBox("裁切区域超出图像范围");ret

8、urnNULL;}//实际影像保存的宽度为4字节的整数倍dwxSave=(dwX*lpBMIH->biBitCount+31)/32*4;//实际影像块的大小dwBitsSize=dwxSave*dwY;//裁切后的DIB图像大小(不包含文件头)DWORDdwClipedSize;dwClipedSize=sizeof(BITMAPINFOHEADER)+PaletteSize(lpDIB)+dwBitsSize;//为裁切后的DIB分配内存HDIBhClipedDIB;hClipedDIB=(HDIB)::GlobalAlloc(GMEM_M

9、OVEABLE

10、GMEM_ZEROINIT,dwClipedSize);//获得图像指针LPSTRlpClipedDIB=(LPSTR)::GlobalLock((HGLOBAL)hClipedDIB);//拷贝信息头和调色板memcpy(lpClipedDIB,lpDIB,sizeof(BITMAPINFOHEADER)+PaletteSize(lpDIB));//修改信息头中影像长、宽、长度LPBITMAPINFOHEADERpClipedDibIFH=(LPBITMAPINFOHEADER)lpClipedDIB;pClipedDibIF

11、H->biWidth=dwX;pClipedDibIFH->biHeight=dwY;pClipedDibIFH->biSizeImage=dwX*d

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。