读取SD卡里面的BMP文件 显示到TFT上 - 蟲子

本帖最后由 littleworm 于 2009-4-23 16:33 编辑

最近论坛上很多人问起 这方面的东东
我刚好最近做了一个BMP565格式的图片显示
就随手写一下把资料能贴的贴一下 呵呵
大家一起交流

首先是从sd卡里面读取BMP文件
用了FAT16的文件系统 (呵呵 一直用小卡 暂时没必要上FAT32 呵呵)
关于FAT16文件系统 可以参考我的这个帖子 里面有完整可运行与豆皮的工程代码
http://bbs.stmfans.com/viewthread.php?tid=1218&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D3


然后关于BMP文件的读取 我用的是BMP565格式的图片
下面copy一些关于BMP文件格式的资料过来

BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者 bmp(有时它也会以.DIB.RLE作扩展名)。


6.1.2文件结构


位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。


位图文件的组成


结构名称


符号


位图文件头(bitmap-file header)


BITMAPFILEHEADER


bmfh


位图信息头(bitmap-information header)


BITMAPINFOHEADER


bmih


彩色表(color table)


RGBQUAD


aColors[]


图象数据阵列字节


BYTE


aBitmapBits[]


位图文件结构


位图文件结构内容摘要


 


偏移量


域的名称


大小


内容


 


 


 


图象文件



0000h


文件标识


2 bytes


两字节的内容用来识别位图的类型:


‘BM' Windows 3.1x, 95, NT, ...


‘BA' OS/2 Bitmap Array


‘CI' OS/2 Color Icon


‘CP' OS/2 Color Pointer


‘IC' OS/2 Icon


‘PT' OS/2 Pointer


注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识"BM"就行。


 


0002h


File Size


1 dword


用字节表示的整个文件的大小


 


0006h


Reserved


1 dword


保留,必须设置为0


 


000Ah


Bitmap Data Offset


1 dword


从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量


 


000Eh


Bitmap Header Size


1 dword


位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:


28h - Windows 3.1x, 95, NT, ...


0Ch - OS/2 1.x


F0h - OS/2 2.x


注:在Windows95982000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。


 


0012h


Width


1 dword


位图的宽度,以象素为单位


 


0016h


Height


1 dword


位图的高度,以象素为单位


 


001Ah


Planes


1 word


位图的位面数(注:该值将总是1)



图象


信息



 


 


001Ch


Bits Per Pixel


1 word


每个象素的位数


1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)


4 - 16 色位图


8 - 256 色位图


16 - 16bit 高彩色位图


24 - 24bit 真彩色位图


32 - 32bit 增强型真彩色位图


 


001Eh


Compression


1 dword


压缩说明:


0 - 不压缩 (使用BI_RGB表示)


1 - RLE 8-使用8RLE压缩方式(BI_RLE8表示)


2 - RLE 4-使用4RLE压缩方式(BI_RLE4表示)


3 - Bitfields-位域存放方式(BI_BITFIELDS表示)


 


0022h


Bitmap Data Size


1 dword


用字节数表示的位图数据的大小。该数必须是4的倍数


 


0026h


HResolution


1 dword


用象素/米表示的水平分辨率


 


002Ah


VResolution


1 dword


用象素/米表示的垂直分辨率


 


002Eh


Colors


1 dword


位图使用的颜色数。如8-比特/象素表示为100h或者 256.


 


0032h


Important Colors


1 dword


指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要


调色板数据


根据BMP版本的不同而不同


Palette


N * 4 byte


调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:



1字节用于蓝色分量



1字节用于绿色分量



1字节用于红色分量



1字节用于填充符(设置为0)



图象数据


根据BMP版本及调色板尺寸的不同而不同


Bitmap Data


xxx bytes


该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。




biBitCount=16 表示位图最多有216种颜色。每个色素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,而在565格式下,它们则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码"与"上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。

BMP文件我是用photoshop转换的
这个是我的图片的16进制数据 大家可以明显看到0xF800、0x07E0、0x001F 呵呵
未命名.jpg
2009-4-23 16:15


BMP数据 是从0x46h开始的 读取完毕BMP的头 确认是你所认知的图片 就可以从这个位置开始读取数据 然后一个bit一个bit的显示就完了

    s32 fileseek = 0x46;
    fat16_seek_file(fd, &fileseek, FAT16_SEEK_SET);

      for(u8 i=0;i<240;i++)
      {
        fat16_read_file(fd, filebuf, sizeof(filebuf)-1);
        Lcd_Show_Bmp565(0, 239-i,320, 1, filebuf);
      }

当然 前提是TFT得驱动好  呵呵 我的是tft61505的TFT 呵呵
下面贴出关于这部分显示的代码 包括读取sd卡里的BMP 和 TFT的驱动部分

在TFT上面画图

IMG_0449.JPG

一个简单的菜单

IMG_0451.JPG

显示BMP图片时的效果 呵呵 有人知道图片上的是什么地方么?

IMG_0459.JPG

代码.rar (6.55 KB)

TFT BMP565

1

评分人数

  • lvhaian

我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

呵呵,支持一下,多谢分享

TOP

好东西呀,TFT液晶的驱动是什么型号的呀?

TOP

支持一下,,,,,,

TOP

好东西呀,TFT液晶的驱动是什么型号的呀?
zy_sh_npk 发表于 2009-4-24 10:03



已经说了啊  tft61505
我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

TOP

喔,好像没听说过这个型号,我手里有块ILI9320的!

TOP

呵呵 一样的啦
你把TFT驱动好就OK了
能写点就能画线 能画线就能画图
能画图就能画anything
呵呵
我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

TOP

看看,多谢楼主

TOP

楼主真神人也~~~~
砖家级的水准……

TOP

本帖最后由 bbandpp 于 2009-5-4 14:49 编辑

虫子动作很快。

我发现用软件将24bit的图片转换成16bit的图片后都是bmp555的格式的,不是565的格式的。
所以大家在实际使用的时候要注意位数的转换。要不然色彩偏差比较大。
还有就是得注意读取出来的数据的高低位。bmp图片格式的低位在前,单片机的数据是高位在前,的将读取出来的数据进行高低位转换。

TOP

我一般用的是ps来转的
可以设定格式
我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

TOP

楼主,太强大了,非常非常非常感谢

TOP

强大,非常强呀!

TOP

hao   bu cuo de hen

TOP

都是强人啊

TOP

好东西,感谢分享!

TOP

太强了   帮顶。。楼主
深深的迷恋你ATM

TOP

我也顶。。。呵呵
呵呵,学习需要帮助,互进

TOP

呵呵,支持一下,多谢分享

TOP

Review opelc.org on alexa.com