位图格式解析

一.位图文件的基本结构

一个典型的位图文件由以下几个部分组成:
1.文件头(BITMAPFILEHEADER):这部分用于识别文件是否为位图文件,并提供文件大小和位图数据的位置等信息。它通常占据14字节

2.位图信息头(BITMAPINFOHEADER):此部分提供图像的尺寸、颜色深度、压缩方式和颜色索引等详细信息。对于不包含掩码的情况,它占据40字节。如果包含掩码,则后面跟随3个DWORD的掩码。

3.调色板(Color Palette):对于1位、4位和8位颜色深度的位图,存在一个调色板,它是一个RGBQUAD结构体数组,定义了每个颜色索引对应的具体颜色。每个颜色对应4个字节,颜色数量决定调色板长度。

4.位图数据(Bitmap Data):这是文件的主体部分,实际存储了图像的像素数据。像素数据的排列方式通常是从左到右、从下到上。

二.示例解析

这里以深度为1,2048*1080大小,调色板为红,蓝,数据前半部分为1,后半部分为0的位图举例:
1.文件头(BITMAPFILEHEADER):
在这里插入图片描述

    // 文件类型,固定为0x424D(BM)
    unsigned short fileType = 0x424D;     
    // 文件大小276542字节 = 14(文件头) + 40(信息头) + 8(调色板) + 256*1080(数据)
    //因为这里是单色图,所以调色板只有两个颜色,体现在后面的信息头里
    unsigned int fileSize = 0x04383e;    
    // 保留字段1,设为0 
    unsigned short reserved1;    
     // 保留字段2,设为0
    unsigned short reserved2;   
     // 数据偏移量0x3e(62) = 14(文件头) + 40(信息头) + 8(调色板),后面就是数据区
    unsigned int dataOffset;    

2.位图信息头(BITMAPINFOHEADER):
在这里插入图片描述

   // 信息头大小 0x28(40)
    unsigned int headerSize;     
    // 图像宽度0x800 = 2048
    int width;       
    // 图像高度 0x438 = 1080            
    int height;         
    // 平面数,固定为1         
    unsigned short planes;       
    // 颜色位数,这是深度为1,代表两种颜色
    unsigned short bitCount;     
    // 压缩类型,一般为0(不压缩)
    unsigned int compression;    
    // 图像数据大小(有时为0是合法的)
    //如果biSizeImage为0,这可能表明图像数据是连续存储的,没有额外的填充或压缩。
    //在这种情况下,图像数据的大小可以计算得出,或者由文件的总大小减去文件头和信息头的大小来确定
    unsigned int imageSize;      
    // 水平分辨率
    int xPixelsPerMeter;      
     // 垂直分辨率   
    int yPixelsPerMeter;        
    // 使用的颜色数,设为2
    unsigned int colorsUsed;     
    // 重要的颜色数,设为2
    unsigned int importantColors; 

3.调色板(Color Palette):
在这里插入图片描述

  byte A  //透明色分量默认0xFF
  byte R  //红色分量
  byte G  //绿色分量
  byte B  //蓝色分量
  //颜色1 ff ff 00 00  显示红色索引0
  //颜色2 ff 00 00 ff  显示蓝色索引1
 

这里默认应该是黑白两色,这里处理一下声明调色板的作用,显示如下

4.位图数据(Bitmap Data):
图像下部分数据: 下半部分对应红色,对应索引0,数据为0;
在这里插入图片描述
图像上部分数据: 上半部分显示蓝色,对应索引1,数据为1;
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值