您的位置:首页 > 其它

现有一张bmp图片,VC中如何截取图片的指定的一部分并保存

2011-07-28 21:37 555 查看
如题:我是想截取这张图片的某一指定部分,然后保存下来。自己顶下,怎么没人帮忙啊!大虾帮帮忙啊!!不胜感激啊!可以采用gdi+
通过
Bitmap* pbitmap = ::new Bitmap(...);//需要的size
Graphics gph(pbitmap);
gph->DrawImage(...);
...
pbitmap->save(...);
::delete pbitmap

具体可以自己查一下1、读取源图像,得到这张图像的数据。
2、按照你要生成的图像的大小,创建1个新的图像信息头,分配内存空间,创建空白图像数据
3、将你要截取的部分赋值到新的图像内存区
4、写文件。
整体上是这个思路,有很多实现方法,如果只是读写位图文件,API就可以很方便的做。如果需要读取保存更多图片格式,可以借助CxImage和OpenCv这些库图片是显示在界面上的吗?BMP图像的格式很简单。
按照顺序为:位图文件头->位图信息头->调色板信息->颜色信息。
位图文件结构头:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
位图信息头结构为:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 位图信息头大小 为40
LONG biWidth; // 像素上的位图宽度
LONG biHeight; // 像素上的位图高度
WORD biPlanes;
WORD biBitCount; // 多少位表示一个像素颜色
DWORD biCompression;
DWORD biSizeImage; // 位图中描述像素颜色的数据的大小,这个是以4个字节为单位的,不足是0补
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed; // 多少个颜色使用了
DWORD biClrImportant;// 多少个颜色是重要的
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
位图信息按照位图的色的不同而不同,例如24位时,颜色信息中,三个字节表示的是一个位图像素点的RGB值。

完全可以解析BMP文件中的格式来获得像素点的值。

比如。你可以得到几个矩形范围类的像素点的值。然后重新根据这个矩形范围类的像素值重新构造一个BMP文件格式。
重新写入bmp文件头,bmp信息头,bmp调色板,bmp像素信息(这个信息是你要获取的区域内的像素信息,可以直接获取原图中的像素的值获得)。bmp文件头,bmp信息头可以根据实际情况更改,比如说,位图的宽度,位图的高度,位图像素信息的大小,这些都可以直接计算出来。

注意:bmp是按照图像从下向上,按行扫描得到的图像的,而且为像素信息中,如果一行中描述该行的所有像素信息的字节数不是4的整数倍时,要用0补齐,凑出4的整数倍。

网上很多BMP图像的解析,解析出来了就不难做了。祝你成功。如果调用Opencv可以很快的实现。其他的先保存好要存储的数据,然后保存,楼主应该BMP的类吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: