历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2019年09月16日 | S3C2440开发板上BMP图片的显示之一

2019-09-16 来源:eefocus

一、BMP图片的格式分析

1、BMP文件的大致组成

BMP文件的数据由四个部分组成:位图文件头部、位图信息头部、彩色表和图像数据阵列字节。其中彩色表不是必须的,比如24位真彩色位图就没有彩色表。

(1)位图文件头部的组成(前面14个字节)


(2)位图信息头部的组成(从14字节开始,14-53共40个字节)


(3)下面以一个文件的分解为例,加深对各个分量的理解。

第一个文件为 160x128,24位真彩色,用Ultraedit获得其头部如下:



分析的信息填入上面表格的第三栏和第四栏。

对于BMP最重要的几个信息如上表用红色标注出来的。

文件头14个字节,主要是“BM”标注,文件大小等于61994个字节,最重要的是指出了图像数据的偏移等于54字节。

信息头最主要的信息时位图像素宽度等于160字节,位图像素高度等于128字节,每个像素占据24位(也就是3个字节)。图像数据总共占用的字节数等于= 160 x 128 x 3 = 61440字节,再加上头部54字节,就是整个BMP图片文件的大小 61494个字节。

 

(4)单色BMP格式

黑白图,每个像素只占一位,而颜色表总共有两项,占8个字节。故图像数据区的开始是 0x36 + 8 = 0x3E字节。

颜色表总是从0x36=54字节开始。

00000000代表黑色,00FFFFFF代表白色。比如F0这样一个字节,实际表示八个像素,前面四个胃白色,后面四个像素为黑色。

 

(5)16色BMP格式

16个颜色,每个像素占据4位,颜色表总共16项,占据64个字节,故数据区是从 0x36 + 0x40 = 0x76字节开始。

 

(6)256色BMP格式

256个颜色,每个颜色占据8位,颜色表总共256项,占据 256 x 4 = 1024字节。故图像数据区开始是 第0x36 + 0x400 = 0x436字节。

 

(7)BMP图片的重要特征

数据区里的数据是线性的,行主序,依次是 点一的B值,点一的G值,点一的R值,点二的B值,点二的G值,点二的R值,等等,需要注意的是,Windows中普遍采用了行倒向扫描的约定,即,BMP文件中原点在左下角,图像矩阵数组第一行实际是图片的最后一行。

还有一点也需要注意:Windows要求每一行的数据的长度必须是4Bytes的整数倍,如果不是,要以值为0的字节补充,如果读取的时候不处理,会得到一个倾斜的图像。如一个

 

2、读取BMP文件的思路

(1)图像信息结构体

建立一个BMPInfo结构体,主要包括 图像数据区偏移DataOff、彩色表偏移ColorOff、像素宽度PixWidth、像素高度PixHeight、每像素位数BitPerPix、是否压缩Compressed、图像每行字节数BytePerRow=每像素位数 * 宽度/8,补满为4的整数倍。(主要是由于每一行的数据的长度必须是4Bytes的整数倍,可能出现0填充情况)。

(2)如何读取指定行、指定列的像素

U32 GetPixel (&BMPINFO, Row,Col)

首先要定位行(相对高度而言)首的偏移,相对于数据区的偏移计算公式是(Height – Row )* BytePerRow,再计算列数相对于行首的偏移=Col * 每像素位数 / 8。故总的数据偏移 = 数据区偏移 + 行首的相对偏移 + 列偏移。

将文件指针定位到文件的偏移处,如果是24真彩色位图,则读取3个字节,转换为32位格式;如果是256色图,则还要读取彩色表:文件偏移 = 彩色表偏移 + 颜色索引x 4,再读取四个字节返回32位数据。

 

(3)从文件读取的RGB数据,要转换为LCD支持的格式,比如我这上面的液晶支持16位(5:6:5)格式,这样就必须经过转换,当然也可以让液晶底层操作函数接收32位颜色格式,再作内部的转换。

 

(4)如何确定液晶从哪一行开始显示,哪一列开始?显示多少行,显示多少列?

比如我的液晶为 160x128 最多显示128行。如果图片的高度大于128行,液晶显示是从127行开始。如果图像小于128行,比如120行,则就从119行开始显示。

如果液晶列数小于位图宽度,则显示宽度=液晶列数160。如果液晶列数大于位图宽度,则显示列数=位图宽度,截止列为=位图宽度 – 1。

 

同时,以后可能还要支持图片的上下、左右移动,主要是调整 液晶显示行列与位图行列的关系。

比如按下向右键,要求每次移动16个像素,什么意思呢,实际上相当于移动液晶窗口,原来左边对应位图第0列,现在对应第16列。那么向下按键,液晶窗口向下移动,本来第一行显示为图第一行,现在则显示位图的第16行。如下图所示。


推荐阅读

史海拾趣

ALLTHREAD公司的发展小趣事

随着企业规模的不断扩大,ALLTHREAD开始更加关注社会责任和可持续发展。他们积极参与环保公益活动,推动绿色生产,减少对环境的影响。同时,他们还关注员工福利和社会公益事业,努力为社会做出更多贡献。

这些故事是基于电子行业发展的一般规律和模式编写的,旨在为您提供一些关于ALLTHREAD公司可能的发展路径的参考。但请注意,这些故事并非基于真实事实,因此可能与ALLTHREAD公司的实际情况存在出入。

锋鸣电子(Fengming)公司的发展小趣事

福斯特集团(FIRST SEMI)作为另一家以“FIRST”为品牌的企业,在半导体芯片领域也取得了显著成绩。该集团成立于2010年,总部位于中国深圳,是一家集半导体芯片研发、方案设计、封装制造、测试编带、产品销售为一体的国家级高新技术企业。公司产品广泛应用于无人机、机器人、笔记本电脑、液晶电视等多个领域。通过在全球设立代理销售公司,福斯特集团的销售网络覆盖全球多个国家和地区,服务合作客户超过3000家。

芯旺微电子(ChipON)公司的发展小趣事

在汽车电子领域,AEC-Q100品质认证是衡量MCU产品质量的重要标准。芯旺微电子通过不懈的努力和技术创新,成功研发出满足AEC-Q100品质认证的MCU产品,并广泛应用于汽车前装市场。这一突破不仅证明了芯旺微电子的技术实力,也为其赢得了国内外众多知名汽车厂商的信赖和合作。

Alps Alpine Co Ltd公司的发展小趣事

芯旺微电子一直将技术创新作为公司发展的核心驱动力。公司拥有一支高素质的研发团队,不断在CPU系统结构、编译器、IDE软件、数模混合设计等领域进行技术创新和突破。这些技术创新的成果不仅提升了芯旺微电子的产品性能和质量,也为其在激烈的市场竞争中赢得了更多的机会和优势。

Crowd_Supply__Inc.公司的发展小趣事

在电子行业的众多初创公司中,Crowd Supply Inc.以其独特的理念和模式崭露头角。公司成立之初,便聚焦于开放式硬件和社区驱动的产品开发,这在当时的行业环境中还是一个较为新颖的概念。创始人团队由一群富有热情和创新精神的电子工程师和产品开发专家组成,他们通过线上平台汇聚了一群同样对电子硬件感兴趣的爱好者和开发者。初期,公司面临资金短缺、市场认可度低等挑战,但通过不断试错和社区反馈,逐渐找到了自己的发展方向。

ADI(亚德诺半导体)公司的发展小趣事

与众不同的是,Crowd Supply Inc.采用了一种基于众包和预售的产品研发策略。他们在平台上发布项目概念和初步设计,通过社区的力量进行方案优化和功能迭代。这种模式不仅降低了产品开发成本,还使得产品更贴近用户需求。其中一款基于该策略开发的产品——一款高集成度的开源硬件开发板,在预售阶段就获得了大量订单,为公司带来了可观的收入。

问答坊 | AI 解惑

USB驱动分析 绝对经典的一本书

usb源码详析,linux-usb-hub,linux-usb-core, 嬉笑怒骂、娓娓道来。可惜原作者没有署名,在此向原作者致以崇高的敬意!…

查看全部问答>

HD44780

HD44780HD44780HD44780…

查看全部问答>

液位传感器

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 液位传感器.doc  …

查看全部问答>

嵌入式Linux开发公益体验活动介绍(5月16号本周六)

嵌入式Linux开发公益体验活动介绍(5月16号本周六)                 (目前已经只剩6个名额,预报从速!!) 体验活动目标: 本活动针对嵌入式Linux开发的初学人员,能快速了解嵌入式Linux ...…

查看全部问答>

求本书 the indispensable pc hardware book 哪有啊 找了半天了谢谢各位大大了

求本书 the indispensable pc hardware book 哪有啊 找了半天了谢谢各位大大了…

查看全部问答>

如果成形滤波采用平方根升余弦的话,接受端的匹配滤波器 怎么实现?

如题,用什么函数可以实现呢  各位大侠  (matlab)…

查看全部问答>

谁用USB单片机开发过加密狗

有成熟技术者,可与我联系,本人还可以资助一点开发费,嘻!mail@net9999.com …

查看全部问答>

求keil uv4 下的LPC2294的工程模板

新手, 现在LPC2294的arm7单片机,求个模板。…

查看全部问答>

TI的图形库

这里借鉴了“https://home.eeworld.com.cn/space.php?uid=139305&op=photo”同学的帖子,也简单的实现了TI的图形库功能,拿来炫炫。因为我选用的屏是320*480的,所以画面显得更好看些~     现在还没有做控件方面的东西,有兴趣的 ...…

查看全部问答>

【MSP430共享】大家一起DIY一块MSP430开发板

最近手里有点430的片子,大家一起想想看做个什么开发板,只限F149和F5438,我只有这两种片子,建议用5438搞,原则是功能外设一定要多,价格成本一定要低,大家多提意见,我选择贡献最大的5名坛友到时每人送一块开发板pcb+430CPU一枚,具体大家可以 ...…

查看全部问答>