MFC:BMP图像
一.位图格式
Windows中的位图有两种格式:一种被称为设备相关图(Device Depend Bitmap,DDB),另一种被称为设备无关图(Device Independ Bitmap,DIB)
二.DDB位图
DDB位图又称为GDI(Graphics Device Interface,图形设备接口)位图.
在WinSDK中用HBITMAP表示,在MFC中用CBitmap表示,它是一种和设备相关的数据(内存读取)
三.DIB位图
一个DIB位图文件分为4个部分: BITMAPFILEHAEDER BITMAPINFOHEADER 调色板数据和实际的图像数据
与DDB不同的是DIB字节数组是从图像的最下面一行开始逐行向上存储的,也就是把图像倒过来然后逐行扫描,另外字节数组中每个扫描行的字节数必须是4的倍数,如果不足需要0补齐
1.BITMAPFILEHEADER文件头
该结构体固定长度为14个字节
1 2 3 4 5 6 7 8 | typedef struct tagBITMAPFILEHEADER{ WORD bfType; //长度2,是否为bmp图像文件 DWORD bfSize; //长度4,指定文件大小,包括整个文件头 WORD bfReserved1; //长度2,保留字节0 WORD bfReserved2; //长度2,保留字节0 DWORD bfOffBits; //长度4,指定从文件头到实际的图像数据的偏移字节数 }BITMAPFILEHEADER; |
2.BITMAPINFOHEADER信息头
该结构体固定长度为14字节
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //长度为4,指定该结构体的长度 LONG biWidth; //长度为4,指定图像宽度像素 LONG biHeight; //长度为4,指定图像高度像素 WORD biPlanes; //长度为2,值必须为1,表示1个位面 WORD biBitCount; //长度为2,指定颜色位深度,1(黑白二值图)/4(16色图)/8位(256色图) 16(增强色)/24位(真彩色图)/32位 DWORD biCompression; //长度为4,指定位图是否压缩,BI_RGB表示没有图像压缩 DWORD biSizeImage; //长度为4,指定实际图像数据所占用的字节数 LONG biXPelsPerMeter; //长度为4,指定目标设备的水平分辨率 LONG biYPelsPerMeter; //长度为4,指定目标设备的垂直分辨率 DWORD biClrUsed; //长度为4,表示颜色数 DWORD biClrImportant; //长度为4,0表示图像颜色都重要 }BITMAPINFOHEADER; |
3.调色板数据
位深度大于8的DIB不存在调色板数据
1 2 3 4 5 6 | typedef struct tagRGBQUAD{ BYTE rgbBlue; //该颜色蓝色分量 BYTE rgbGreen; //该颜色绿色分量 BYTE rgbRed; //该颜色红色分量 BYTE rgbReserved; //保留值0 }RGBQUAD; |
4.实际图像数据
对于2色位图,用1位表示一个像素的颜色(0表示黑色,1表示白色),一个字节可以表示8个像素
对于16色图,用4位表示一个像素的颜色(0<=n<=16)
对于24色图,用8位表示一个像素的颜色(0<=n<=256)
对于16位图,用2个字节(WORD)表示一个像素
对于24位图,用3个字节表示一个像素
对于32位图,用4个字节表示一个像素
5.显示DIB图像
MFC是不提供任何对DIB的支持函数,但是WinSDK提供了一些DIB操作函数
1 2 3 4 5 6 7 8 9 | GetDIBits //从DDB中获取位图的图像位 SetDIBits //设置DIB位图的图像位,用于将DIB转换为DDB形式 CreateDIBitmap //用指定的DIB来创建DDB,并用DIB信息初始化位图的图像位 SetDIBitmap //直接将DIB位图的图像位输出到设备,用于显示DIB StretchDIBits //将DIB位图映射输出到设备的一个矩形区域,位图可能被缩放 CreateDIBPatternBrush //用DIB位图来创建模式画刷 CreateDIBSection //创建一个可直接写入的DIB GetDIBColorable //获取DIB颜色表 SetDIBColorTable //设置DIB颜色表 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)