http://blog.163.com/lyzaily@126/blog/static/424388372008382912359/

BMP格式补充(16bbp & 32bbp & 4字节对齐 & pixel data存放顺序)

BMP格式补充(16bbp & 32bbp & 4字节对齐)

(DWORD = 4字节)

Bits Per Pixel = 16

最大可以显示2^16色。如果Compression 设置为0(BI_RGB),则Palette为空,
位图数据将是RGB555存放,最高一位保留未使用。
如果Compression 为3(BI_BITFIELDS),Palette为3个DWORD的掩码,分别用
来取出Red,Green,Blue。
BI_BITFIELDS下可能是RGB555,也可能是RGB565,这由掩码决定。

Bits Per Pixel = 32

最大可以显示2^32色。如果Compression 设置为0(BI_RGB),则Palette为空,
位图数据将是RGB888存放,最高一字节保留未使用。
如果Compression 为3(BI_BITFIELDS),Palette为3个DWORD的掩码,分别用
来取出Red,Green,Blue。

4字节对齐

针对1bit,4bit,8bit,16bit,24bit的bmp,32bit bmp一个像素就是4字节,不用对齐。
一个图像有像素宽度(width)和高度2个属性,bmp的4字节对齐是:一行width个
像素的数据长度(字节单位)如果不能被4整除,则用0补齐4字节后再开始存放下一行的
像素数据,如果是最后一行,后面没有数据了,同样要补齐。

有点抽象,上实例:
下面是一个10*10纯白色的8bit bmp的像素数据区,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00
可以看出后面的0x00都是补齐用得数据。

pixel data存放顺序

当BITMAPINFOHEADER的biHeight>0时,为倒序存放,解释如下。(基本上都是倒序存放的)
pixel data  4字节对齐按扫描线为单位存放,扫描线倒序存放,也就是,第一条稍描
线存放在最后,最后一条稍描线存放在pixel data区域的开始。
每个像素的RGB也是倒
叙存放的,即使BGR存放顺序。
这就解释了:矩阵的第一字节代表最左下角落的素,
最后一个字节表示右上角的像素。

总结:BMP真是一个boring的结构,情况复杂,处理起来繁琐,基本上没有压缩,
真是一个糟糕的图像格式。

BMP格式补充(16bbp 32bbp 4字节对齐 pixel data存放顺序)相关推荐

  1. 关于C++中四字节对齐的坑

    最近做一个工程,大体的意思是在程序中定义一个结构,运行中会将结构直接写到文件中,然后另一个程序会用同样的结构读出来.为了验证是写文件的程序的问题还是读文件的程序的问题,用winhex来打开文件,仿照结 ...

  2. 计算机中的字节对齐问题

    [转载]http://www.cnblogs.com/clover-toeic/p/3853132.html 引言 考虑下面的结构体定义: 1 typedef struct{ 2 char c1; 3 ...

  3. C语言字节对齐问题详解

    转载原文连接:https://www.cnblogs.com/clover-toeic/p/3853132.html C语言字节对齐问题详解 引言 考虑下面的结构体定义: 1 typedef stru ...

  4. C语言字节对齐问题详解(zz)

    http://www.bubuko.com/infodetail-263205.html 引言 考虑下面的结构体定义: typedef struct{char c1;short s; char c2; ...

  5. c语言特殊字符字符串宽度对齐,[转]C语言字节对齐问题详解

    引言 考虑下面的结构体定义: 1 typedef struct{2 charc1;3 shorts;4 charc2;5 inti;6 }T_FOO; 假设这个结构体的成员在内存中是紧凑排列的,且c1 ...

  6. 转 结构体中字节对齐问题(转载)

    struct MyStruct { double dda1; char dda; int type }; 对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少 ...

  7. arm的字节对齐问题总结(转)

    问题由来:pc的lsb总是0,因为代码至少要字对齐.cm3的指令至少是半字对齐的(16) 一.啥是字对齐?为啥要字对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访 ...

  8. C语言字节对齐64位和32位

    (第一次写博客:有不对的地方还望指出) 借前辈们的话再详细补充linux64位下字节对齐:   在GNU GCC 编译器中,遵循的准则:根据最宽的基本数据类型来定--对齐模数最大只能是4,也就是说,即 ...

  9. c++内存中字节对齐问题详解

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

最新文章

  1. 和12岁小同志搞创客开发:如何驱动LCD1602液晶显示屏?
  2. SAP行列转换的一个方法
  3. RuoYi后台系统权限管理解析
  4. [转]linux系统增加swap大小方法(安装oracle可能需要)
  5. android 在同一activity切换layout,在 Android Studio 添加一个activity并实现跳转
  6. php 工厂模式 使用场景,PHP设计模式之工厂模式
  7. 基于float的几种布局
  8. tomcat GET 编码疑惑
  9. 智能车s3010舵机工作电压_全国大学生智能车竞赛决战南京信息工程大学
  10. 最小生成树(普利姆算法、克鲁斯卡尔算法)
  11. [转]CPU/GPU/TPU/NPU...XPU都是什么鬼
  12. Mybatis和Hibernate区别
  13. 使用 Productivity Power Tools 高级扩展 来帮助你提高 VS2012 的工作效率
  14. 服务应用突然宕机了?别怕,Dubbo 帮你自动搞定服务隔离!
  15. Java继承和多态实现例子
  16. drcom for linux,Ubuntu Linux 6.10下用Dr.COM(drcom-client)接入网络的问题
  17. ggalluvial | 冲击图/ 桑基图绘制
  18. 租房子,光看数据怎么够,Python爬取某站租房图片
  19. UDP-Based 多路径乱序传输
  20. sql trace基础

热门文章

  1. 三万块钱6天的区块链培训,我学会了搭建区块链系统框架?
  2. mac按键难回弹(按下去软软的)
  3. 系统集成项目管理工程师笔记(2)信息系统服务管理
  4. Java性能监控和故障诊断可视化工具之jmc
  5. python函数第六关
  6. 亚丁号自动阅读第一次更新
  7. 归档数据1000份,筑智建助力融汇温泉城G1项目高效完成数字化落地
  8. windows Git下载与安装
  9. unity直接连接安卓手机,调试运行
  10. CENTOS7 安装eclipse应用