zoukankan      html  css  js  c++  java
  • 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颜色表
    
  • 相关阅读:
    316 Remove Duplicate Letters 去除重复字母
    315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数
    313 Super Ugly Number 超级丑数
    312 Burst Balloons 戳气球
    309 Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
    Java 类成员的初始化顺序
    JavaScript 全局
    HTML字符实体
    Java中的toString()方法
    JavaScript 弹窗
  • 原文地址:https://www.cnblogs.com/k5bg/p/11112228.html
Copyright © 2011-2022 走看看