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

    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颜色表
    
  • 相关阅读:
    数据表分区, 全新分区
    SSIS基础设计最佳实践
    数据表分区, 普通表转分区表
    关于游标[二]
    弹窗代码汇集
    关于分页显示中的换行显示原理代码
    C# 装箱和拆箱[整理]
    insert into tablename select * from tablename与Select * into tablename from tablename 比较[转]
    SQL Server应用程序中的高级SQL注入
    CHARINDEX使用【转】
  • 原文地址:https://www.cnblogs.com/k5bg/p/11112228.html
Copyright © 2020-2023  润新知