DIB位图(Bitmap)的读取和保存

设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上。它的文件结构是标准化的,可以在Windows/Linux/Unix等平台上显示相同的效果。本文主要介绍了
1. 如果将位图文件从磁盘读到内存中
2. 在内存中对位图文件进行操作后,如何将位图保存到磁盘

1 读取位图到内存中

1.1 DIB文件结构

要将位图文件(.bmp)从磁盘读取到内存,首先要了解其文件结构。DIB的文件组成有以下4个部分:
1. 文件表头,主要包含了文件的类型(必须是BM),文件的大小(所占用的字节数)和位图的像素矩阵的便宜量。
2. 信息表头,包含了两部分内容:位图的相关信息(位图的大小、位深度、位面数、压缩和编码等)和指向RGB颜色表(调色盘)的指针。
3. RGB色彩对照表,也就是调色板,不一定会有。16位及以上直接使用RGB通道表示颜色,一般不需要调色板。
4. 位图的像素信息矩阵,表示具体的像素。1,4,8位颜色,保存的是调色板的索引,具体的颜色根据索引在调色板中查找;16位及其以上不使用调色板,直接使用RGB组成像素颜色。

1.2 在Windows下DIB的内存结构

要将DIB数据读取到内存,就需要在内存中分配相应的空间。Windows提供了几种结构体,结构体中的字段对应着DIB文件的各个信息值,具体如下
alter

引用自 http://blog.csdn.net/wenzhou1219/article/details/26162869

将DIB读取到内存只需要将磁盘数据填充到相应到结构体即可。在磁盘上DIB需要连续的结构存储,在内存中则不需要连续的存储空间,可以分段将数据读取到相应的结构体中。
读取DIB到内存的具体步骤:
1. 将文件头信息读取到BITMAPFILEHEADER结构体中。
2. 将位图头信息读取到BITMAPINFOHEADER结构体中。
3. 如果有调色板,则将其信息读取到RGBQUAD中。
4. 读取位图像素信息到像素矩阵中。

fp.Read(&bmfileHeader, sizeof(BITMAPFILEHEADER)); // 读取BMP文件头 
...
//读取文件信息头
ret = fp.Read(&bmHeader, sizeof(BITMAPINFOHEADER)); 
...
fp.Read(m_dibBits, GetBodySize());  //读取像素信息 
1.3 结构体各字段信息
BITMAPFILEHEADER

代表文件头信息的结构体BITMAPFILEHEADER的声明如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值