从内存图像数据中,截取矩形框框的图像数据
2013-05-31 10:35
302 查看
上篇写读取BMP文件并在界面DC上显示了,是经过拉伸的
现在呢,在DC上画个矩形框框,从内存图像数据中,截取矩形框框的图像数据
画框框这部分跳过,需要知道你在DC区域的起点坐标和终点坐标,还有DC区域的宽高,还要有原图的图像数据Buf和头信息
[cpp]
view plaincopyprint?
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;//原图一行数据大小
[cpp]
view plaincopyprint?
<SPAN style="WHITE-SPACE: pre"> </SPAN>//BmpInfo是原图的信息结构,pBMPDataBuf是原图的数据buf
[cpp]
view plaincopyprint?
<SPAN style="WHITE-SPACE: pre"> </SPAN>//先把指针移动到最后一行的第一个像素字节
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;//往后移动等待拷贝
}
}
[cpp]
view plaincopyprint?
}
这样获得了截图的数据,自己再构造bmp文件头,或者用原图的也可以,该下数据大小和宽高,就可以保存图片了
显示效果图,上面为原图画矩形框,下面为截取的图
现在呢,在DC上画个矩形框框,从内存图像数据中,截取矩形框框的图像数据
画框框这部分跳过,需要知道你在DC区域的起点坐标和终点坐标,还有DC区域的宽高,还要有原图的图像数据Buf和头信息
[cpp]
view plaincopyprint?
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;//原图一行数据大小
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;//原图一行数据大小
[cpp]
view plaincopyprint?
<SPAN style="WHITE-SPACE: pre"> </SPAN>//BmpInfo是原图的信息结构,pBMPDataBuf是原图的数据buf
//BmpInfo是原图的信息结构,pBMPDataBuf是原图的数据buf
[cpp]
view plaincopyprint?
<SPAN style="WHITE-SPACE: pre"> </SPAN>//先把指针移动到最后一行的第一个像素字节
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;//往后移动等待拷贝
}
}
//先把指针移动到最后一行的第一个像素字节 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;//往后移动等待拷贝 } }
[cpp]
view plaincopyprint?
}
}
这样获得了截图的数据,自己再构造bmp文件头,或者用原图的也可以,该下数据大小和宽高,就可以保存图片了
显示效果图,上面为原图画矩形框,下面为截取的图
相关文章推荐
- VC 截图 矩形 按比例从内存图像数据中截图
- OpenCV截取图像的任意形状区域,规则的图形(圆、椭圆、矩形),不规则鼠标自己选择
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果,滤波,图像截取) 对图片的处理 : 亮度调整 抓屏 翻转 随鼠标画矩形
- [good]opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- OpenCV学习笔记(18):在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- [OpenGL调试]保存并查看内存中的数据图像
- opencv中对Mat类型图像感兴趣(ROI)轮廓外接矩形并截取保存结果
- Python图像处理之pillow-图像的矩形截取
- brew画内存中的图像数据
- opencv-- 使用鼠标绘制矩形并截取和保存矩形区域图像
- DM642学习点滴三:将DSP内存中的图像数据保存为BMP图像
- 利用GDAL从内存中直接解析图像数据
- BREW,使用内存中的图像数据,创建IIMAGE对象
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像