一.位图格式

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个字节

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字节

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不存在调色板数据

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操作函数

GetDIBits                //从DDB中获取位图的图像位
SetDIBits                //设置DIB位图的图像位,用于将DIB转换为DDB形式
CreateDIBitmap           //用指定的DIB来创建DDB,并用DIB信息初始化位图的图像位
SetDIBitmap              //直接将DIB位图的图像位输出到设备,用于显示DIB
StretchDIBits            //将DIB位图映射输出到设备的一个矩形区域,位图可能被缩放
CreateDIBPatternBrush    //用DIB位图来创建模式画刷
CreateDIBSection         //创建一个可直接写入的DIB
GetDIBColorable          //获取DIB颜色表
SetDIBColorTable         //设置DIB颜色表

优质内容筛选与推荐>>
1、JavaScript面向对象之方法重载
2、Python——HTML基础
3、install kali on my x200
4、生成6位随机码含字母大小写+数字
5、浅谈Ruby和JRuby的学习


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn