现有一张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的类吧。
通过
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的类吧。
相关文章推荐
- 【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片
- vc截取整个屏幕保存成bmp图片
- VC++截取屏幕(截图)并存为bmp图片
- vc++ mfc 里保存缩放的bmp图片 不失真
- mfc 截取桌面 并保存为 bmp 图片
- opencv鼠标画矩形截取保存图片一部分并归一化为原图大小(Patches selected for feature extraction)
- android如何把Res目录下的一张图片保存到本地
- MFC下截取窗口特定部分并保存为bmp图片的类
- VC2005中将Picture控件显示图片保存为BMP,JPG等格式
- 如何读取某个指定文件夹下所有文件,并筛选出其中的图片文件(jpeg,bmp)展示出来。
- 截取指定区域的并保存图片
- 微信中如何长按图片保存的是另一张图片
- VC下把HBITMAP保存为bmp图片
- [openvc]4.创建一张图片并保存到本地
- VC中实现截屏并保存为.bmp格式的图片
- 如何使用LoadBitmap加载一张BMP图片(win)
- vc++ mfc 里保存缩放的bmp图片 不失真
- 教你如何HTML显示一张图片的一部分
- 教你如何HTML显示一张图片的一部分
- 怎样用 c# GDI+ 截取一张图片的一部分,然后再替换另一张图片的一部分