VC 截图 矩形 按比例从内存图像数据中截图
2013-02-19 16:56
411 查看
也是自己写过代码,自己记录,怕以后忘了
上篇写读取BMP文件并在界面DC上显示了,是经过拉伸的
现在呢,在DC上画个矩形框框,从内存图像数据中,截取矩形框框的图像数据
画框框这部分跳过,需要知道你在DC区域的起点坐标和终点坐标,还有DC区域的宽高,还要有原图的图像数据Buf和头信息
这样获得了截图的数据,自己再构造bmp文件头,或者用原图的也可以,该下数据大小和宽高,就可以保存图片了
显示效果图,上面为原图画矩形框,下面为截取的图
上篇写读取BMP文件并在界面DC上显示了,是经过拉伸的
现在呢,在DC上画个矩形框框,从内存图像数据中,截取矩形框框的图像数据
画框框这部分跳过,需要知道你在DC区域的起点坐标和终点坐标,还有DC区域的宽高,还要有原图的图像数据Buf和头信息
void CBMPControl::CutBMP(CPoint OrgPoint,CPoint EndPoint,int ircWidth,int ircHeight)//从内存中截图 { //先根据宽高进行比例计算 float fWidthScale = (float)ircWidth/BmpInfo.bmiHeader.biWidth;//宽的比例 float fHeightScale = (float)ircHeight/BmpInfo.bmiHeader.biHeight;//高的比例 int iOrgX = OrgPoint.x/fWidthScale+0.5;//进行四舍五入 int iOrgY = OrgPoint.y/fHeightScale+0.5; int iEndX = EndPoint.x/fWidthScale+0.5; int iEndY = EndPoint.y/fHeightScale+0.5; long lWidth = iEndX - iOrgX;//截图的像宽 long lHeight = iEndY - iOrgY;//高度 long lLineSize = (lWidth*BmpInfo.bmiHeader.biBitCount+31)/32*4;//截图一行字节数 long lImgSize = lLineSize*lHeight;//截图总大小 pCutBMPBuf = new BYTE[lImgSize];//分配内存 memset(pCutBMPBuf,0,lImgSize); BYTE * pSBuf = NULL;//指向源图数据指针 BYTE * pDBuf = NULL;//指向pCutBMPBuf的指针 pDBuf = pCutBMPBuf; //在内存中,存储方式是倒置的,内存第一行第一个,是显示的最后一行第一个,x不变,y倒置 long lSrcLineSize = (BmpInfo.bmiHeader.biWidth*BmpInfo.bmiHeader.biBitCount+31)/32*4;//原图一行数据大小
//BmpInfo是原图的信息结构,pBMPDataBuf是原图的数据buf
//先把指针移动到最后一行的第一个像素字节 pSBuf = pBMPDataBuf+(BmpInfo.bmiHeader.biHeight-iEndY)*lSrcLineSize+//原图一行的字节大小*截图的最后一行的位置+第一个像素的字节位置 (iOrgX*BmpInfo.bmiHeader.biBitCount+31)/32*4;//第一个像素位置就是起点的X,转换为字节位置 for(int i = 1;i<=lHeight;i++) { memcpy(pDBuf,pSBuf,lLineSize);//从源图中拷贝lLineSize个数据到目标内存 pSBuf = pBMPDataBuf+(BmpInfo.bmiHeader.biHeight-(iEndY-i))*lSrcLineSize+//一行一行的拷贝数据 (iOrgX*BmpInfo.bmiHeader.biBitCount+31)/32*4; if (i!=lHeight)//没有到最后一行,就继续移动 { pDBuf = pDBuf + lLineSize;//往后移动等待拷贝 } }
}
这样获得了截图的数据,自己再构造bmp文件头,或者用原图的也可以,该下数据大小和宽高,就可以保存图片了
显示效果图,上面为原图画矩形框,下面为截取的图
相关文章推荐
- 从内存图像数据中,截取矩形框框的图像数据
- VC共享内存实现进程间数据的交换
- zw版_Halcon图像交换、数据格式、以及超级简单实用的DIY全内存计算.TXT
- BASE64编码和解码(VC源代码) 并 内存加载 CImage 图像
- 在VC上实现如何从内存中读取JPEG、GIF等图像
- (转)VC中等比例缩放图像
- linux应用Xlib来显示内存图像数据到窗口的方式
- [VC6] 图像文件格式数据查看器
- 将内存图像数据封装成QImage V2
- 关于用VC,VB进行图像数据(二进制大对象)存储数据库的一点心得
- VC共享内存实现进程间数据的交换
- 使用ADO实现vc中二进制文件数据的存取(以图像在数据库中的存取为例)
- vtk获取内存中图像数据
- 屏幕截图+OpenCV读取内存中的数据
- 从游戏中得到动态内存数据(汇编+VC 例子:疯狂坦克的X坐标)
- 在VC上实现如何从内存中读取JPEG、GIF等图像
- 【Qt开发】将内存图像数据封装成QImage V2
- vtk获取内存中图像数据
- 【Qt开发】如何将内存图像数据封装成QImage V1