zoukankan      html  css  js  c++  java
  • bitmap格式分析

    我们来看看位图文件(*.BMP)的格式。
    位图文件主要分为如下3个部分:
    块名称
    对应Windows结构体定义
    大小(Byte
    文件信息头
    BITMAPFILEHEADER
    14
    位图信息头
    BITMAPINFOHEADER
    40
    RGB颜色阵列
    BYTE*
    由图像长宽尺寸决定
    1、   文件信息头BITMAPFILEHEADER
    结构体定义如下:
    typedef struct tagBITMAPFILEHEADER { /* bmfh */
    UINT bfType;  
    DWORD bfSize; 
    UINT bfReserved1; 
    UINT bfReserved2; 
    DWORD bfOffBits;
    } BITMAPFILEHEADER;
    其中:
    bfType
    说明文件的类型,该值必需是0x4D42,也就是字符'BM'。
    bfSize
    说明该位图文件的大小,用字节为单位
    bfReserved1
    保留,必须设置为0
    bfReserved2
    保留,必须设置为0
    bfOffBits
    说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。
    2、位图信息头BITMAPINFOHEADER
    结构体定义如下:
    typedef struct tagBITMAPINFOHEADER { /* bmih */
    DWORD biSize; 
    LONG biWidth; 
    LONG biHeight; 
    WORD biPlanes; 
    WORD biBitCount; 
    DWORD biCompression; 
    DWORD biSizeImage; 
    LONG biXPelsPerMeter; 
    LONG biYPelsPerMeter; 
    DWORD biClrUsed; 
    DWORD biClrImportant;
    } BITMAPINFOHEADER;
    其中:
    biSize
    说明BITMAPINFOHEADER结构所需要的字数。
    biWidth
    说明图象的宽度,以象素为单位。
    biHeight
    说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。
    biPlanes
    为目标设备说明位面数,其值将总是被设为1。
    biBitCount
    说明比特数/象素,其值为1、4、8、16、24、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。
    biCompression
    说明图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB
    biSizeImage
    说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0
    biXPelsPerMeter
    说明水平分辨率,用象素/米表示。
    biYPelsPerMeter
    说明垂直分辨率,用象素/米表示。
    biClrUsed
    说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。
    biClrImportant
    说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
    3、RGB颜色阵列
    有关RGB三色空间我想大家都很熟悉,这里我想说的是在Windows下,RGB颜色阵列存储的格式其实BGR。也就是说,对于24位的RGB位图像素数据格式是:
    蓝色B
    绿色G
    红色R
    对于32位的RGB位图像素数据格式是:
    蓝色B
    绿色G
    红色R
    透明通道A
    透明通道也称Alpha通道,该值是该像素点的透明属性,取值在0(全透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。
     
    行对齐
    由于Windows在进行行扫描的时候最小的单位为4个字节,所以当
    图片宽 X 每个像素的字节数 = 4的整数倍
    时要在每行的后面补上缺少的字节,以0填充(一般来说当图像宽度为2的幂时不需要对齐)。
     
    注意:
    bmp文件的RGB数据第一行表示的是LCD最后一行的数据
  • 相关阅读:
    非科班毕业生四个月的面试准备,网易三轮面面试,成功拿下offer(面经奉上)全靠这份阿里面试手册
    太赞了!华为鸿蒙工程师总结的Linux笔记,提供下载
    阿里java岗面试有多难?分享阿里面试真题(附面试专题答案)及P7所要掌握的技能体系!
    阿里腾讯百度等大厂2020秋招面试总结,内附答案
    小小码农的大梦想,2020最新BAT大厂面试题干货总结
    历经三个月的紧张复习,秋招终于进了百度,附上面经分享希望可以帮助大家
    这份《高性能MySQL》适合数据库管理员(DBA)阅读,也适合开发人员参考学习
    这份程序员必备书籍《Spring实战4》,你确定不看看?
    自学JAVA的我提交给2020的问卷答案,JAVA核心知识点分享这一年来的努力并没有白费!
    Delphi连接数据库的两种方式
  • 原文地址:https://www.cnblogs.com/chd-zhangbo/p/5725679.html
Copyright © 2011-2022 走看看