前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bmp图片解码

bmp图片解码

作者头像
福贵
发布2019-05-05 14:41:35
2.5K0
发布2019-05-05 14:41:35
举报
文章被收录于专栏:菜鸟致敬菜鸟致敬

bmp是window上最简单的图片了,没有压缩,而且易于读取,实现一个简单的bmp图片解码器是学习图像处理的入门必备啊。

参考bmp标准,其结构被分为了四个部分,文件头,位图信息头,颜色信息和图形数据。

前面54个字节已经固定,其中前14字节为文件头,后40字节为位图信息头。

之后可能存在一个不确定长度的记录颜色信息的调色板,最后才是记录的图形数据。

bmp的结构如下:

文件头:

  1. 文件类型2字节
  2. 文件大小4字节
  3. 保留字符4字节
  4. 偏移量(很重要的一个数据)

偏移量记录的是文件头到图形数据开始的字节数,比如偏移量off_bit为54,那么表示该图从第55个字节才是图形数据开始记录的地方。

图形数据记录的是每个像素点的颜色信息。

之后,我们需要以二进制的形式打开bmp文件,with open("name.bmp", "rb") as file,就能够得到字节流。再之后按照bmp结构进行解码即可,比如前两个字节解码。

这里需要用到Python里面对字节解码的函数,在模块struct里面有pack和unpack两个函数,pack用来编码,将字符串变为字节,而unpack将字节解码成字符串。

unpack(fmt, string),fmt代表解压出来的数据的格式,string代表字节,举栗子,在bmp图片解码开始的时候:

unpack("2s", file.read(2)),表示解析前两个字节,并且前两个字节是两个字符,即2s表达的意思。

i代表integer,I代表无符号的integer,s代表字符串,等等,具体参数可以参考下面的链接,写的非常的棒,比我强十倍不止。

sanyuesha.com/2018/03/10/why-pack-unpack

之后继续进行解码,读取四个字节,file.read(4),这记录的是文件的大小。之后继续读取保留的四个位置,之后就读到了偏移量,unpack("i", file.read(4)),记录了图像数据开始的位置。

偏移量是第11-14位字节记录,可以使用seek函数可以移动当前的位置,如seek(5)指移动到第5个字节处,tell函数可以得到当前读取的位置。

考虑普通的真彩色图片,则第55个字节开始就是记录的rgb的数据,不过注意的是,数据是由左下角向右开始记录,并且是bgrbgr这样记录,当这一行结束之后再才记录上一行的数据,并且每一行的字节数必须保证为4的倍数,如果不是,则填0,直到每行字节数为4的倍数。

简而言之,解码器实现原理简单,主要在于弄懂bmp的结构和字节的解码!

写了一个很简单的例子,可以实现读取rgb的值并写入txt的功能,如有需要请自行下载!

www.toseek.cc/py/1.py

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与MySQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档