VC中挑选BMP图片的矩形区域子集
来源:互联网 发布:浮山王子三角梅淘宝网 编辑:程序博客网 时间:2024/05/04 07:39
现在有一个BMP图片, 要挑选出它的一块矩形区域子图片。如下图所示,左边为原来的BMP图片,右边为通过鼠标挑选出来的子图片。
我是通过读取BMP本身的数据DATA,然后只拷贝矩形区域的DATA到一个新的buffer中来实现的,没有调用函数库。
void CpictureControlDlg::GetBMPSubImage(BITMAPINFOHEADER *pParentHead, BYTE *pParentBits, const CRect &subArea,BITMAPINFOHEADER *&pSubHead, BYTE *&pSubBits){if ((pParentHead == nullptr) || (pParentBits == nullptr)){return;}if (pSubHead != nullptr){delete pSubHead;}if (pSubBits != nullptr){delete []pSubBits;}pSubHead = new BITMAPINFOHEADER;memcpy(pSubHead, pParentHead, sizeof(BITMAPINFOHEADER));pSubHead->biWidth = abs(subArea.Width());pSubHead->biHeight = abs(subArea.Height());const int subOneLineBytes = subArea.Width() * pSubHead->biBitCount / 8;const int subOneLineAlignBytes = (subOneLineBytes % 4 == 0) ? subOneLineBytes : (subOneLineBytes / 4 + 1) * 4;int subImageDataSize = subOneLineAlignBytes * pSubHead->biHeight;pSubBits = new BYTE[subImageDataSize];pSubHead->biSizeImage = subImageDataSize;memset(pSubBits, 0, subImageDataSize);BYTE *p = pSubBits;const int lineOffset = subArea.left * pSubHead->biBitCount / 8;const int parentOneLineBytes = pParentHead->biWidth * pParentHead->biBitCount / 8;for (int line = pParentHead->biHeight - subArea.bottom; line < pParentHead->biHeight - subArea.top; ++line){memcpy(p, pParentBits + line*parentOneLineBytes + lineOffset, subOneLineBytes);p += subOneLineAlignBytes;}}上述代码说明,这个函数一共5个参数, 其中前两个参数,用来描述原始BMP图片,中间的CRect用来描述子图在原始图片中对应的矩形区域,
最后两个参数作为输出,用来描述子图片。
完成上述代码要注意两点:
1. 位置描述不一致。 CRect的坐标系使用的是屏幕坐标系, 原点位于左上角,x轴向右,Y轴向下。
而bmp图片数据,即代码中的pBits的存储的原点位于图片左下角,x轴向右,y轴向上。
2. 选择出来的子bmp图片需要进行4字节对齐。
0 0
- VC中挑选BMP图片的矩形区域子集
- opencv中替换图片ROI矩形区域的方法
- 截取图片中间矩形区域的图片
- VC中显示ICON和BMP图片
- 自定义view中在指定的矩形区域中放入一张图片
- 现有一张bmp图片,VC中如何截取图片的指定的一部分并保存
- VC制作bmp图片
- VC++ 导出bmp图片
- VC BMP图片操作
- 把bmp图片的白色区域转化称透明
- 要求把屏幕的一个矩形区域抓成bmp图象怎么办
- VC 将界面中静态控件画的图形保存为bmp格式的图片
- VC中获取BMP图片高度与宽度的两种方法
- VC中获取BMP图片高度与宽度的两种方法
- VC中实现截屏并保存为.bmp格式的图片
- VC++中bmp图象的显示
- VC++中bmp图象的显示
- VC++中bmp图象的显示
- 1090. Highest Price in Supply Chain
- leetcode:Binary Tree Preorder Traversal
- 快速重新搭建CloudStack系统
- 揭开MVC的神秘面纱
- 图解SQL的各种连接join
- VC中挑选BMP图片的矩形区域子集
- 手把手教你_怎么找android应用的包名和启动activity
- Shell编程关于Sha-Bang(#!)
- LeetCode[Array]: Set Matrix Zeroes
- Python version 2.7 required, which was not found in the registry
- hdu 5124 line STL pair
- OpenCV2 学习笔记(1)OpenCV2.4.10在Win7(64位)+VS2010下的配置过程
- vim常用20条命令.
- leetcode:Same Tree