从内存图像数据中,截取矩形框框的图像数据

上篇写读取BMP文件并在界面DC上显示了,是经过拉伸的

现在呢,在DC上画个矩形框框,从内存图像数据中,截取矩形框框的图像数据


画框框这部分跳过,需要知道你在DC区域的起点坐标和终点坐标,还有DC区域的宽高,还要有原图的图像数据Buf和头信息

  1. void CBMPControl::CutBMP(CPoint OrgPoint,CPoint EndPoint,int ircWidth,int ircHeight)//从内存中截图   
  2. {  
  3.     //先根据宽高进行比例计算   
  4.     float fWidthScale = (float)ircWidth/BmpInfo.bmiHeader.biWidth;//宽的比例   
  5.     float fHeightScale = (float)ircHeight/BmpInfo.bmiHeader.biHeight;//高的比例   
  6.   
  7.     int iOrgX = OrgPoint.x/fWidthScale+0.5;//进行四舍五入    
  8.     int iOrgY = OrgPoint.y/fHeightScale+0.5;  
  9.     int iEndX = EndPoint.x/fWidthScale+0.5;   
  10.     int iEndY = EndPoint.y/fHeightScale+0.5;  
  11.     long lWidth = iEndX - iOrgX;//截图的像宽   
  12.     long lHeight = iEndY - iOrgY;//高度   
  13.     long lLineSize = (lWidth*BmpInfo.bmiHeader.biBitCount+31)/32*4;//截图一行字节数   
  14.     long lImgSize = lLineSize*lHeight;//截图总大小   
  15.   
  16.     pCutBMPBuf = new BYTE[lImgSize];//分配内存   
  17.     memset(pCutBMPBuf,0,lImgSize);  
  18.     BYTE * pSBuf = NULL;//指向源图数据指针   
  19.     BYTE * pDBuf = NULL;//指向pCutBMPBuf的指针   
  20.     pDBuf = pCutBMPBuf;  
  21.     //在内存中,存储方式是倒置的,内存第一行第一个,是显示的最后一行第一个,x不变,y倒置   
  22.     long lSrcLineSize = (BmpInfo.bmiHeader.biWidth*BmpInfo.bmiHeader.biBitCount+31)/32*4;//原图一行数据大小  
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;//原图一行数据大小
  1. <SPAN style="WHITE-SPACE: pre"> </SPAN>//BmpInfo是原图的信息结构,pBMPDataBuf是原图的数据buf  
	//BmpInfo是原图的信息结构,pBMPDataBuf是原图的数据buf
  1. <SPAN style="WHITE-SPACE: pre"> </SPAN>//先把指针移动到最后一行的第一个像素字节   
  2.     pSBuf = pBMPDataBuf+(BmpInfo.bmiHeader.biHeight-iEndY)*lSrcLineSize+//原图一行的字节大小*截图的最后一行的位置+第一个像素的字节位置   
  3.         (iOrgX*BmpInfo.bmiHeader.biBitCount+31)/32*4;//第一个像素位置就是起点的X,转换为字节位置   
  4.     for(int i = 1;i<=lHeight;i++)  
  5.     {  
  6.         memcpy(pDBuf,pSBuf,lLineSize);//从源图中拷贝lLineSize个数据到目标内存   
  7.         pSBuf = pBMPDataBuf+(BmpInfo.bmiHeader.biHeight-(iEndY-i))*lSrcLineSize+//一行一行的拷贝数据   
  8.             (iOrgX*BmpInfo.bmiHeader.biBitCount+31)/32*4;  
  9.         if (i!=lHeight)//没有到最后一行,就继续移动   
  10.         {  
  11.             pDBuf = pDBuf + lLineSize;//往后移动等待拷贝   
  12.         }  
  13.     }  
	//先把指针移动到最后一行的第一个像素字节
	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;//往后移动等待拷贝
		}
	}
  1. }  
}

这样获得了截图的数据,自己再构造bmp文件头,或者用原图的也可以,该下数据大小和宽高,就可以保存图片了

显示效果图,上面为原图画矩形框,下面为截取的图



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值