zoukankan      html  css  js  c++  java
  • BMP图片的解析,关于压缩方式

    在做一个显示bmp图片到lcd屏的时候,发现有些bmp图显示不对.

    同样是16bit bmp却有差异.

    就查了一下格式.

    bmp文件格式

    位图文件的组成

    结构名称

    符号

    位图文件头(bitmap-file header)

    BITMAPFILEHEADER

    bmfh

    位图信息头(bitmap-information header)

    BITMAPINFOHEADER

    bmih

    彩色表(color table)

    RGBQUAD

    aColors[]

    图像数据阵列字节

    BYTE

    aBitmapBits[]

     

    偏移量

    域的名称

    大小

    内容

     

     

     

    图像文件

    0000h

    标识符(Identifier)

    2 bytes

    两字节的内容用来识别位图的类型:

    BM : Windows 3.1x, 95, NT,

    BA :OS/2 Bitmap Array

    CI :OS/2 Color Icon

    CP :OS/2 Color Pointer

    IC : OS/2 Icon

    PT :OS/2 Pointer

     

    0002h

    File Size

    1 dword

    用字节表示的整个文件的大小

     

    0006h

    Reserved

    1 dword

    保留,设置为0

     

    000Ah

    Bitmap Data Offset

    1 dword

    从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量

     

    000Eh

    Bitmap Header Size

    1 dword

    位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:

    28h - Windows 3.1x, 95, NT,

    0Ch - OS/2 1.x

    F0h - OS/2 2.x

     

    0012h

    Width

    1 dword

    位图的宽度,以像素为单位

     

    0016h

    Height

    1 dword

    位图的高度,以像素为单位

     

    001Ah

    Planes

    1 word

    位图的位面数

    图像

    信息

     

     

    001Ch

    Bits Per Pixel

    1 word

    每个像素的位数

    1 - Monochrome bitmap

    4 - 16 color bitmap

    8 - 256 color bitmap

    16 - 16bit (high color) bitmap

    24 - 24bit (true color) bitmap

    32 - 32bit (true color) bitmap

     

    001Eh

    Compression

    1 dword

    压缩说明:

    0 - none (也使用BI_RGB表示)

    1 - RLE 8-bit / pixel (也使用BI_RLE4表示)

    2 - RLE 4-bit / pixel (也使用BI_RLE8表示)

    3 - Bitfields (也使用BI_BITFIELDS表示)

     

    0022h

    Bitmap Data Size

    1 dword

    用字节数表示的位图数据的大小。该数必须是4的倍数

     

    0026h

    HResolution

    1 dword

    用像素/米表示的水平分辨率

     

    002Ah

    VResolution

    1 dword

    用像素/米表示的垂直分辨率

     

    002Eh

    Colors

    1 dword

    位图使用的颜色数。如8-位/像素表示为100h或者 256.

     

    0032h

    Important Colors

    1 dword

    指定重要的颜色数。当该域的值等于颜色数时,表示所有颜色都一样重要

    调色板数据

    0036h

    Palette

    N * 4 byte

    调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:

    • 1字节用于蓝色分量 
    • 1字节用于绿色分量 
    • 1字节用于红色分量 
    • 1字节用于填充符(设置为0)

    图像数据

    0436h

    Bitmap Data

    x bytes

    该域的大小取决于压缩方法,它包含所有的位图数据字节,这些数据实际就是彩色调色板的索引号

     后来打印了一下头信息的各个值发现,压缩方式不一样

    Compression =0 或

    Compression=3.

    Compression=0时 rgb565使用3个字节即,R、G、B各占1个字节,共3个字节。

    Compression=3时R、G、B总共占2个字节。 调色板数据会存储三个掩码。 RGB565,这三个值是0xF800、0x07E0、0x001F。

    即取出2个字节的图像数据与上0xF800就是R

    其他压缩方式较复杂,没有使用到。

  • 相关阅读:
    使用redis配置分布式session
    邮件发送整合
    Spark基础-scala学习(八、隐式转换与隐式参数)
    QMQ去哪儿网-mq中间件(启动失败)
    Spark基础-scala学习(七、类型参数)
    JMH实践-代码性能测试工具
    Spark基础-scala学习(五、集合)
    [JavaWeb基础] 012.Struts2 自定义标签使用
    html5学习之路_003
    [Objective-C] 017_UI篇_UIView(中)
  • 原文地址:https://www.cnblogs.com/fengeryi/p/3658519.html
Copyright © 2011-2022 走看看