BMP图片解码
基于STM32的BMP图片解码系统
结构 . 包含 B 它 MP图 像 文 件 的 类 型 、 示 内 容 等 信 息 ; 图 显 位
信息数据结构 , 它包 含 有 B MP 图像 的宽 、 、 缩 方 法 , 及 高 压 以
空 间 的方 式 , 即采 用 了 边解 码 边 显 示 的方 法 . 省去 了外 部 数 据 R M, A 随之 而来 的就 是显示 的 速度 比直接 调到 内存 中要 慢 一些 。
22 液 晶 显 示部 分 电路 设 计[ . S l
液 晶 显 示 部 分 主 要 由 微 控 制 器 s M3 F 0 R T T 2 l 3 B 6驱 动
S 卡 的 读写 操 作 。 D
14 F . AT 文 件 系统 简 介
A 4 3 0 S N W— O M2 0 2L T Q O H完 成 人 机界 面状 态 的显 示 ,通 过 发
送命 令 字 , 成 液 晶模 块 的 初 始 化 。 成 对 内容 的显 示 。 示 完 完 显 部分 的硬 件 电路 接 口图 如 图 2所 示 。
( 中国 飞 行 试 验研 究 院 陕 西 西 安 7 0 6 1 0 9)
摘 要 : 计 了 一 种 基 于 S M3 设 T 2处 理 器 的 便 携 式 B P 图 片解 码 系 统 。 在 设 计 过 程 中采 用 了从 S M D卡 中读 取 编 码 的 同 时 同步 解 码 的 方 法 , 效 地 减 少 了 系统 内存 的 消 耗 。 完 成 了基 于 A M 最 新 C r x M3内核 的 处 理 器 S M3 有 R o e— t T 2的 B P M
S D卡 ( e ueD g a M mo a ) 文 翻 译 为 安 全 数 码 S c r i tl e r C r 中 i y d
嵌入式Linux系统中图片解码和显示的视频编解码
嵌入式Linux系统中图片解码和显示的视频编解码嵌入式系统已经成为当今数字化生活中不可或缺的一部分。
在这些系统中,图像和视频的处理和显示是非常重要的功能。
本文将讨论在嵌入式Linux系统中如何进行图片解码和显示的视频编解码。
一、图片解码在嵌入式Linux系统中,图片解码是将图像文件转换为可显示的图像的过程。
常见的图像格式包括JPEG、PNG、BMP等。
图片解码的过程可以分为以下几个步骤:1. 图像读取:首先,嵌入式Linux系统需要读取图像文件。
可以通过文件系统访问或网络下载的方式来获取图像文件。
2. 图像解码:一旦获取了图像文件,需要使用适当的图像解码器将其解码为原始的图像数据。
在嵌入式Linux系统中,常用的图像解码技术包括libjpeg和libpng等库。
3. 图像处理:解码后的图像数据可能需要进行一些处理,例如图像的缩放、旋转、色彩空间转换等。
这些处理可以通过使用OpenCV等图像处理库来完成。
4. 图像显示:最后,解码并处理后的图像数据可以通过使用嵌入式系统的显示设备进行显示,例如LCD屏幕或HDMI接口。
二、视频编解码在嵌入式Linux系统中,视频编解码是将视频文件进行压缩和解压缩的过程。
视频编码使得视频文件的大小变得更小,方便存储和传输,而解码则将压缩的视频文件还原为可播放的视频流。
常见的视频编解码格式包括H.264、MPEG-4、VP8等。
以下是视频编解码的步骤:1. 视频读取:嵌入式Linux系统需要从存储介质或网络中读取视频文件。
视频文件通常以容器格式(例如MP4、AVI、MKV等)存储。
2. 视频解封装:一旦获取了视频文件,需要进行视频解封装。
解封装是将视频文件中的音视频流提取出来的过程。
解封装通常由FFmpeg等库实现。
3. 视频解码:解封装后的视频数据需要进行解码。
解码器会将压缩的视频数据解码为原始的视频帧数据。
常用的视频解码器有FFmpeg、GStreamer等。
4. 视频处理:解码后的视频数据可以进行一些处理,例如帧率转换、画面滤镜等。
嵌入式Linux系统的图片解码和显示方法详解
嵌入式Linux系统的图片解码和显示方法详解嵌入式Linux系统在如今的物联网应用中扮演着重要的角色。
其中,图片解码和显示是嵌入式系统中常见的需求,它们对于展示图形化界面、实现图像处理等方面都具有重要意义。
本文将详细讨论嵌入式Linux系统中的图片解码和显示方法。
一、图片解码方法在嵌入式Linux系统中,常见的图片格式有JPEG、PNG、BMP等。
针对不同的图片格式,可以采用不同的解码方法。
1. JPEG解码JPEG是一种广泛应用于图像压缩和存储的格式。
在嵌入式Linux系统中,常用的JPEG解码库有libjpeg和libturbojpeg等。
libjpeg是一个开源的JPEG解码库,广泛应用于多个平台。
该解码库提供了一系列的API接口,可以方便地在嵌入式Linux系统中进行JPEG解码操作。
通过使用libjpeg库,可以将JPEG图片解码为RGB格式,从而在系统中进行后续的图像处理或显示。
libturbojpeg是libjpeg的增强版,它在性能上有一定的优化,特别适用于有限的资源嵌入式系统。
libturbojpeg同样提供了丰富的API接口,可以实现对JPEG图片的高效解码。
2. PNG解码PNG是一种无损的位图格式,广泛应用于图像存储和传输。
在嵌入式Linux系统中,可以使用libpng库进行PNG图片的解码。
libpng是一个开源的PNG解码库,它提供了灵活的API接口,可以实现对PNG图片的解码和处理。
通过libpng库,可以将PNG 图片解码为RGBA格式,方便在系统中进行进一步的图像处理或显示。
3. BMP解码BMP是一种非压缩的位图格式,可以直接在屏幕上显示。
在嵌入式Linux系统中,可以通过解析BMP文件头和像素数据,实现对BMP图片的解码。
BMP图片的解码相对简单,只需按照文件格式解析头信息,提取像素数据,并根据颜色格式进行解析,即可获取图片的RGB数据。
二、图片显示方法在嵌入式Linux系统中,图片的显示可以通过多种方式实现。
BMP图像格式详解
BMP格式图像文件详析首先请注意所有的数值在存储上都是按“高位放高位、低位放低位的原则”,如12345678h放在存储器中就是7856 3412)。
下图是导出来的开机动画的第一张图加上文件头后的16进制数据,以此为例进行分析。
T408中的图像有点怪,图像是在电脑上看是垂直翻转的。
在分析中为了简化叙述,以一个字(两个字节为单位,如424D就是一个字)为序号单位进行,“h”表示是16进制数。
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2......BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
一、图像文件头1)1:图像文件头。
424Dh=’BM’,表示是Windows支持的BMP 格式。
2)2-3:整个文件大小。
4690 0000,为00009046h=36934。
3)4-5:保留,必须设置为0。
4)6-7:从文件开始到位图数据之间的偏移量。
4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。
8000 0000,为00000080h=128。
7)12-13:位图高度,以像素为单位。
9000 0000,为00000090h=144。
8)14:位图的位面数,该值总是1。
0100,为0001h=1。
二、位图信息头9)15:每个像素的位数。
BMP图片格式详解
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作扩展名)。
二.BMP格式结构BMP文件的数据按照从文件头开始的先后顺序分为四个部分:◆位图文件头(bmp file header):提供文件的格式、大小等信息◆位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息◆调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表◆位图数据(bitmap data):图像数据区BMP图片文件数据表如下:三.BMP文件头BMP文件头结构体定义如下:typedef struct tagBITMAPFILEHEADER{UINT16 bfType; //2Bytes,必须为"BM",即0x424D 才是Windows位图文件DWORD bfSize; //4Bytes,整个BMP文件的大小UINT16 bfReserved1; //2Bytes,保留,为0UINT16 bfReserved2; //2Bytes,保留,为0DWORD bfOffBits; //4Bytes,文件起始位置到图像像素数据的字节偏移量} BITMAPFILEHEADER;BMP文件头数据表如下:四.BMP信息头BMP信息头结构体定义如下:typedef struct _tagBMP_INFOHEADER{DWORD biSize; //4Bytes,INFOHEADER结构体大小,存在其他版本INFOHEADER,用作区分LONG biWidth; //4Bytes,图像宽度(以像素为单位)LONG biHeight; //4Bytes,图像高度,+:图像存储顺序为Bottom2Top,-:Top2BottomWORD biPlanes; //2Bytes,图像数据平面,BMP存储RGB数据,因此总为1 WORD biBitCount; //2Bytes,图像像素位数DWORD biCompression; //4Bytes,0:不压缩,1:RLE8,2:RLE4DWORD biSizeImage; //4Bytes,4字节对齐的图像数据大小LONG biXPelsPerMeter; //4 Bytes,用象素/米表示的水平分辨率LONG biYPelsPerMeter; //4 Bytes,用象素/米表示的垂直分辨率DWORD biClrUsed; //4 Bytes,实际使用的调色板索引数,0:使用所有的调色板索引DWORD biClrImportant; //4 Bytes,重要的调色板索引数,0:所有的调色板索引都重要}BMP_INFOHEADER;BMP信息头数据表如下:五.BMP调色板BMP调色板结构体定义如下:typedef struct _tagRGBQUAD{BYTE rgbBlue; //指定蓝色强度BYTE rgbGreen; //指定绿色强度BYTE rgbRed; //指定红色强度BYTE rgbReserved; //保留,设置为0 } RGBQUAD;1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据,即调色板最多只需要256项(索引0 - 255)。
bmp解码原理
bmp解码原理
BMP(Bitmap Image File)是一种常见的图像文件格式,其解码原理主要包括以下几个步骤:
1. 读取文件头信息:BMP文件以特定的文件头标识开始,用于标识该文件
是一个BMP格式的文件。
这些信息包括BMP文件的类型、大小、版本等。
2. 解析图像头信息:紧随文件头信息之后的是图像头信息,包括图像的宽度、高度、像素数、颜色深度等信息。
这些信息用于确定图像的尺寸、颜色模式等。
3. 读取像素数据:根据图像头信息中的宽度、高度和像素数,读取相应的像素数据。
BMP图像的像素数据按照一定的顺序存储,通常是按照行优先的
顺序逐行读取。
4. 转换像素数据:由于BMP图像的像素数据是以特定的格式存储的,解码时需要将这些数据转换为可显示的像素值。
这通常涉及到将颜色深度转换为实际的颜色值,以及进行必要的色彩空间转换等。
5. 显示图像:将解码后的像素数据送入显示设备,按照一定的显示模式进行显示,最终呈现出BMP图像的内容。
在解码过程中,需要注意一些细节问题,比如数据对齐、像素格式转换等。
此外,还需要根据具体的BMP版本和编码方式进行相应的解码处理。
嵌入式Linux系统中图片解码和显示的动态加载技术
嵌入式Linux系统中图片解码和显示的动态加载技术在嵌入式Linux系统中,图片解码和显示是一个常见的需求。
本文将介绍一种动态加载技术,可以实现在嵌入式Linux系统中灵活地解码和显示图片。
一、嵌入式Linux系统中的图片解码技术在嵌入式Linux系统中,图片通常以二进制数据的形式存储在文件系统中。
为了将图片显示在屏幕上,需要对图片进行解码。
常见的图片格式有JPEG、PNG和BMP等。
不同的图片格式需要使用不同的解码算法。
1. JPEG图片解码JPEG是一种广泛使用的图片格式,其解码算法较为复杂。
在嵌入式Linux系统中,可以使用开源的图像处理库libjpeg来进行JPEG图片的解码。
libjpeg提供了一组API接口,可以方便地将JPEG图片解码成为RGB格式或YUV格式的图像数据。
2. PNG图片解码PNG是一种无损压缩的图片格式,其解码算法相对简单。
在嵌入式Linux系统中,可以使用开源的图像处理库libpng来进行PNG图片的解码。
libpng同样提供了一组API接口,可以方便地将PNG图片解码成为RGB格式的图像数据。
3. BMP图片解码BMP是一种简单的图片格式,其解码算法较为简单。
在嵌入式Linux系统中,可以使用开源的图像处理库libbmp来进行BMP图片的解码。
libbmp提供了一组API接口,可以将BMP图片解码成为RGB格式的图像数据。
二、嵌入式Linux系统中的图片显示技术在嵌入式Linux系统中,图片显示通常是通过显示驱动来实现。
显示驱动负责将解码后的图像数据发送给显示设备,显示设备将图像数据显示在屏幕上。
1. Framebuffer技术Framebuffer是一种常见的图形显示设备,它提供了一块连续的内存区域用于存储图像数据。
在嵌入式Linux系统中,可以通过Framebuffer设备将图像数据显示在屏幕上。
可以使用开源的framebuffer库fbi来实现在Framebuffer设备上显示图像数据。
bmp文件解码
件而言的。有些位图,如真彩色图是不需要调色板的,BITMAPINFOHEADER
后直接是位图数据。
调色板实际上是一个数组,共有 biClrUsed 个元素(如果该值为零,则
有 2 个元素)。数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节,
其定义如下:
typedef struct tagRGBQUAD {
指定目标设备的垂直分辨Байду номын сангаас,单位同上。 46 biClrUsed
指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为 2。 50 biClrImportant
指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重 要的。
第三部分为调色板 Palette,当然,这里是对那些需要调色板的位图文
还有一点也需要注意:Windows 要求每一行的数据的长度必须是 4Bytes 的整 数倍,如果不是,要以值为 0 的字节补充,如果读取的时候不处理,会得到 一个倾斜的图像。
unsigned char data[9604]; FATFS fs; FRESULT res; UINT br; /* *********************************************************** * Function name : Pic_Viewer();
DWORD 为无符号 32 位整数),各个域的说明如下: 0 bfType
指定文件类型,必须是 0x424D,即字符串“BM” 2 bfSize
指定文件大小,包括这 14 个字节。 6 bfReserved1,bfReserved2
为保留字,不用考虑 10 bfOffBits
为从文件头到实际的位图数据的偏移字节数,即图中前三个部分的长度 之和。
项目(2)-基于51单片机的BMP图片解码(电子相册)
4.2、解码算法
首先从位图的信息头中得到位图的像素,位图的高度和宽度,还有位图的送 颜色位数等参数。
图片大小处理:我们使用的 TFT 液晶屏的像素是 320*240 大小。如果图片的 像素小于 320*240,则可以将图片的全部像素输出。但如果图片大小比 320*240 大,则要缩小该图片才能显示。我们通常采取的方法是用比例抽取方法,就是按 一定的缩小比例,抽取图片中的某些像素输出显示,其它像素则丢弃不要。
2:位图信息头
BMP 位图信息头数据用于说明位图的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{
嵌入式学习——BMP 图片解码(项目 2)
DWORD biSize; // 本结构所占用字节数 LONGbiWidth; // 位图的宽度,以像素为单位 LONGbiHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 目标设备的级别,必须为 1 WORD biBitCount// 每个像素所需的位数,必须是 1(双色), // 4(16 色),8(256 色)或 24(真彩色)之一 DWORD biCompression; // 位图压缩类型,必须是 0(不压缩), // 1(BI_RLE8 压缩类型)或 2(BI_RLE4 压缩类型)之一 DWORD biSizeImage; // 位图的大小,以字节为单位 LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数 LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数 DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数 DWORD biClrImportant;// 位图显示过程中重要的颜色数 } BITMAPINFOHEADER;
bmp信号通路 机制
bmp信号通路机制标题:bmp信号通路的工作原理引言:bmp信号通路是一种常用的数字图像处理方式,它在图像传输和存储中起着重要的作用。
本文将介绍bmp信号通路的工作原理,包括信号的产生、传输和解码过程,以及相关的技术细节。
一、信号的产生bmp信号通路的第一步是信号的产生,即将图像转换为数字信号。
传统的bmp格式图像是由像素点组成的,每个像素点的颜色值通过RGB三个分量来表示。
在信号的产生过程中,首先将图像分割成若干个像素点,然后通过采样和量化技术将每个像素点的RGB值转换为数字信号。
二、信号的传输经过信号产生后,数字信号需要通过信号通路进行传输。
在传输过程中,主要考虑的是信号的稳定性和抗干扰性。
为了保证信号的稳定性,通常会采用差分编码和调制技术来对信号进行处理。
差分编码可以减小信号传输中的噪声干扰,而调制技术可以将数字信号转换为模拟信号,以便在信号传输过程中更好地适应信道环境。
三、信号的解码在信号传输到接收端后,需要进行解码操作,将数字信号转换为原始图像。
解码过程主要包括差分解码和调制解调两个步骤。
差分解码将差分编码的信号还原为原始信号,而调制解调则将模拟信号转换为数字信号。
通过这两个步骤的处理,最终可以得到与原始图像相符的数字信号。
结论:bmp信号通路是一种重要的数字图像处理方式,它通过信号的产生、传输和解码过程,实现了图像的传输和存储。
在实际应用中,需要注意信号的稳定性和抗干扰性,以及解码过程中的差分解码和调制解调等细节。
通过深入了解bmp信号通路的工作原理,可以更好地理解数字图像处理的基本原理,并在实际应用中进行优化和改进。
嵌入式Linux系统中图片解码和显示的开发技巧与工具
嵌入式Linux系统中图片解码和显示的开发技巧与工具嵌入式系统的发展使得嵌入式Linux系统越来越受到关注。
在嵌入式Linux系统中,图片解码和显示是一项非常重要的技术,涉及到图形图像的处理和显示。
本文将介绍在嵌入式Linux系统中图片解码和显示的开发技巧与工具。
一、图像解码技术在嵌入式Linux系统中,主要采用以下几种图像解码技术:1. JPEG解码技术JPEG是一种常用的图像压缩格式,具有压缩比高、解压缩速度快等特点。
在嵌入式Linux系统中,可以使用libjpeg等库对JPEG图像进行解码。
2. PNG解码技术PNG是一种无损压缩的图像格式,支持Alpha通道,具有透明度的效果。
在嵌入式Linux系统中,可以使用libpng等库对PNG图像进行解码。
3. BMP解码技术BMP是Windows系统上常用的图像格式,其图像数据存储形式简单,适合在嵌入式Linux系统中进行解码。
二、图像显示技术在嵌入式Linux系统中,一般采用以下几种图像显示技术:1. Framebuffer技术Framebuffer是一种不依赖于X Window系统的图形设备驱动程序接口,可以通过直接访问内存映射的方式来进行图像的显示。
在嵌入式Linux系统中,Framebuffer技术是一种常用的图像显示技术。
2. DirectFB技术DirectFB是一种轻量级的图形设备接口,提供了一套功能丰富的API,可以用来控制多种图形设备。
在嵌入式Linux系统中,可以使用DirectFB技术来进行图像的显示。
3. Qt技术Qt是一种跨平台的应用程序开发框架,提供了丰富的图形界面组件和功能。
在嵌入式Linux系统中,可以使用Qt技术进行图像的显示。
三、开发工具在嵌入式Linux系统中进行图片解码和显示的开发,可以选择以下开发工具:1. GCC编译器GCC是一种常用的开源编译器,可以用于在嵌入式Linux系统中编译和调试C/C++代码。
三分钟解析24位真彩BMP格式文件 - 推酷
请 输 入 评 论 内 容 ...
已发表评论数(0)
搜索文章
/articles/FvaIVj
登录后评论
4/7
15-4-9
相关站点
ITeye-博客
+ 订阅
相关主题
技术
三分钟解析24位真彩BMP格式文件 - 推酷
热门文章
1. 栈溢出的利用
2. 记一次tcmalloc分配内存引起的coredump
3. RapidJSON —— C++ 快速 JSON 解析器和生成器
4. C++学习之引用
/articles/FvaIVj
5/7
15-4-9
三分钟解析24位真彩BMP格式文件 - 推酷
5. 在 Visual Studio 本地引用 Boost 6. Exploiting CVE-2015-0311, Part II: Bypassing Control Flow Guard on Window..
/articles/FvaIVj
7/7
/articles/FvaIVj
1/7
15-4-9
三分钟解析24位真彩BMP格式文件 - 推酷
000000XX0h 是用来方面看数据的(也可以方便记数),比如数据表的第一行的第三个字节数 据 9E 的位置就是 00000000h + 2 = 00000002h ,这就是为什么在一些解释中定位中使用 000000XXXh 的原因。
因此在我们的读取数据中需要根据 BMP 图像的宽度来判断是否被补 0 ,判断方法就是先 判断一行的字节数是否可以被 4 整除,如果整除则不需要补 0 ,如果没有整除,则求出补的 0 的个数(具体计算方法是, bu_0_number = width( 像素 ) * 3 % 4 ),那么就知道在每 一行的末尾都补了 bu_0_number 个 0 ,因此我们在读取时绘制图片时就要忽略这些数据。 (补充:求每一行的字节数 size = width * 3 )
嵌入式Linux系统中图片解码和显示的图像分析技术
嵌入式Linux系统中图片解码和显示的图像分析技术嵌入式Linux系统中的图片解码和显示技术在各种应用中发挥着重要作用。
本文将探讨嵌入式Linux系统中使用的图像分析技术,重点讨论图像解码和图像显示的相关技术。
一、图像解码技术图像解码是将图像数据从编码格式转换为原始像素数据的过程。
在嵌入式Linux系统中,常用的图像解码技术有以下几种:1.1 JPEG解码技术JPEG(Joint Photographic Experts Group)是一种广泛使用的图像压缩标准,其解码技术在嵌入式Linux系统中得到了广泛应用。
JPEG解码技术能够高效地将JPEG格式的图像数据解码为原始的像素数据,以供后续的显示和处理。
1.2 PNG解码技术PNG(Portable Network Graphics)是一种无损压缩的图像格式,其解码技术在嵌入式Linux系统中也得到了广泛应用。
PNG解码技术能够将PNG格式的图像数据解码为原始的像素数据,同时保留图像的透明度信息,适用于需要保留背景透明效果的应用场景。
1.3 BMP解码技术BMP(Bitmap)是一种无压缩的图像格式,其解码技术在嵌入式Linux系统中也有所应用。
BMP解码技术能够将BMP格式的图像数据快速解码为原始的像素数据,但由于其无压缩的特点,文件大小较大,在资源有限的嵌入式系统中使用相对较少。
二、图像显示技术图像显示是将解码后的图像数据在屏幕上显示的过程。
在嵌入式Linux系统中,常用的图像显示技术有以下几种:2.1 Framebuffer技术Framebuffer技术是一种直接操作显存的图像显示技术,其在嵌入式Linux系统中得到了广泛应用。
Framebuffer技术通过在显存中维护一个或多个帧缓冲区,将解码后的图像数据直接写入显存,实现图像的快速显示。
2.2 DirectFB技术DirectFB技术是一种轻量级的图像显示技术,其在嵌入式Linux系统中也得到了广泛应用。
BMP文件解码的研究与实现
-1180-0引言随着计算机图形学的发展,越来越多的人采用计算机来存储图像数据。
图像存储的文件格式种类很多,BMP 文件是其中较著名的一种图像格式。
“BMP ”是“Bitmap (位图)”文件的简称。
它是Windows 采用的图形文件格式,为大多数在Win-dows 环境下运行的图像处理软件所支持。
BMP 文件格式具有如下特点:(1)一个文件只能存储一幅图像,图像以像素为基本单位进行组织;(2)文件支持多种色系,常用的有双色位图、16色位图、256色位图、16位增强色位图、24位真彩色位图、32位真彩色位图;同时BMP 文件提供简单的数据压缩方法(如RLE 、掩码等);(3)文件一般由4部分组成:文件头、文件信息头、调色板和数据信息。
但需要注意的是,16位增强色、24位和32位真彩色位图一般没有调色板;(4)数据信息一般按照从下到上、从左到右的形式描述位图中的像素。
描述的像素以行为单位进行组织,每行所占的字节数一般为4的倍数;(5)每个像素的信息可以由R 、G 、B (红、蓝、绿)3个整型数值描述,每个数值的大小是0~255之间。
1BMP 文件格式的多样性计算机图形学的发展使得BMP 图像的格式在不断地演变,引入了很多的格式变种的BMP 图像呈多元化发展。
其中的一些变化使得早期的解码程序无法对现有的BMP 图像种类进行解码。
目前处理的BMP 文件主要存在如下的变化,需要引起解码程序设计者的注意。
1.1BMP 的文件标识BMP 文件一般采用前两个字节“BM ”作为文件标识。
这实际上是Windows 的一种标识方式,其它操作系统标识不一定是这个。
以OS/2为例,其标识就可能是“BA ”、“CI ”、“CP ”、“IC ”、“PT ”等,由于不同的操作系统定义的BMP 文件格式有收稿日期:2005-01-05。
作者简介:李伟(1981-),男,北京人,硕士研究生,研究方向为通信与信息系统;张利华(1972-),男,湖北京山人,博士,研究方向为移动Ad Hoc 网络和Wireless Sensor Network 。
BMP文件解码的研究与实现
有如下特 点:
图中的像素 。描述 的像素 以行 为单位进 行组织 , 行所 占的 每 字 节数一般 为 4的倍 数 :
() 5 每个 像素 的信 息可以 由R G、 ( 、 、 3 、 B 红 蓝 绿) 个整 型数
值 描述 , 每个 数值 的大小是 0 25之 间。 -5
BMP格式介绍(一)
BMP格式介绍(⼀)原理篇:⼀、编码的意义。
让我们从⼀个简单的问题开始,-2&-255(中间的操作符表⽰and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的⼈并不多。
这个看起来和图⽚格式没有关系的问题恰恰是图⽚格式的核⼼内容以⾄于整个计算机系统的核⼼内容,多媒体技术虽然没有数据结构,操作系统等计算机基础课所占的地位重,但是在于研究编码⽅⾯有着⾮常重要的地位。
图像其实可以看做⼀种特殊编码过的⽂件。
⼆、从简单的24位bmp开始bmp是最常见也是编码⽅式最简单的图⽚格式,这⾥不说明⼀幅图⽚是怎么显⽰在电脑上的,那不是多媒体技术研究的问题,我们来研究bmp的格式问题,为了使各位能够最快的了解bmp格式,我们从24位的⼀个16*16的⼩图像开始。
我们使⽤常⽤的绘图软件创建⼀个16*16的24位bmp图像,如下图所⽰:可以看到图⽚很⼩,我们使⽤ultra-edit看看其内部是什么(ultra-edit是⼀个⽐记事本更加⾼级的编辑软件,可以在⽹上下载到),我们打开其内部看到的是如下的⼀个⼗六进制的数据⽂件:看起来很⾼深⽽⼜很凌乱的样⼦,我们慢慢地说明这些看起来很凌乱的数据流都代表了什么意思,⾸先我们要说明的是,这⾥⾯⼀个数字代表的是⼀个字节,⽐如头两个数42 4d是两个⼗六进制的数,代表了两个字节。
可以看到在UE中⼀⾏是⼗六个字节。
在具体说明每个字节的含义之前,⾸先需要说明的是字节的排布⽅式,在操作系统和计算机组成结构⾥⾯有⼤端法和⼩端法(如果有遗忘可以查⼀下书),简易的说法是这样的,⼩端法的意思是“低地址村存放低位数据,⾼地址存放⾼位数据”,⼤端法就是反过来的,举个例⼦,如果地址从左到右依次增⼤,那么数据01 02的⼩端法存储⽅式是02 01,⼤端法的存储⽅式就是01 02。
在所有的intel的机器上都是采⽤的⼩端法,⽽⼤端法主要存在于摩托罗拉造的处理器的机器上,所以如果你⽤的是⼀个果粉,⽤的是MAC的话,那么你看到的数据排布⽅式是和我们说明中是相反的。
JPGBMPTIFPNG图像编码压缩率和编解码时间比较
JPGBMPTIFPNG图像编码压缩率和编解码时间⽐较Test picture compression format .bmp:Time of reading : 28.68 msTime of writing : 6.79 msTime of decoding : 3.98 msTime of encoding : 4.82 msEncode radio : 100.00% Psnr : 361.20Test picture compression format .jpg:Time of reading : 0.99 msTime of writing : 0.54 msTime of decoding : 19.51 msTime of encoding : 20.15 msEncode radio : 5.77% Psnr : 39.71Test picture compression format .tif:Time of reading : 8.79 msTime of writing : 2.85 msTime of decoding : 70.26 msTime of encoding : 97.59 msEncode radio : 38.89% Psnr : 361.20Test picture compression format .png:Time of reading : 5.53 msTime of writing : 2.38 msTime of decoding : 76.55 msTime of encoding : 216.28 msEncode radio : 32.01% Psnr : 361.20具体测试程序:#include <stdio.h>#include "m_tools.h"#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <fstream>using namespace std;int calPsnr(const string filepath, const char * _ext, double& t_read, double& t_write, double& t_decode, double& t_encode, double& encode_ratio, double & psnr){long long t0 = _getTickCount();cv::Mat src_bmp = cv::imread(filepath);long long t1 = _getTickCount();int w = src_bmp.cols;int h = src_bmp.rows;const std::string ext = _ext;vector<int> opts;if( ext == ".png" ){opts.push_back(cv::IMWRITE_PNG_COMPRESSION);opts.push_back( 9);}else if ( ext == ".jpg" ){opts.push_back(cv::IMWRITE_JPEG_QUALITY);opts.push_back( 90);}else if ( ext == ".bmp" ){}std::vector<uchar> pkg_buff;cv::imencode(ext, src_bmp, pkg_buff, opts);long long t2 = _getTickCount();cv::Mat src_png = cv::imdecode(pkg_buff,CV_LOAD_IMAGE_COLOR);long long t3 = _getTickCount();{FILE* file = fopen((string("dst")+ext).c_str(), "w" );fwrite(&pkg_buff[0],1, pkg_buff.size(), file );fclose(file);}long long t4 = _getTickCount();{std::ifstream f(string("dst")+ext);std::string s;while (f>>s);}long long t5 = _getTickCount();double _psnr= cv::PSNR( src_bmp, src_png );psnr += _psnr;//printf("Psnr of %dx%d%s and %s is %.2f ", w, h, filepath.c_str(), ext.c_str(), _psnr);float src_kb = w*h*3/1024.0;float dst_kb = pkg_buff.size()/1024.0;encode_ratio += dst_kb*100.0/src_kb;//printf("In=%.2fKB Out=%.2fKB Compression ratio=%.2f%\n", src_kb, dst_kb, dst_kb*100.0/src_kb); t_read += (t5-t4)/_getTickFrequency();t_write += (t4-t3) /_getTickFrequency();t_decode += (t3-t2) /_getTickFrequency();t_encode += (t2 - t1) /_getTickFrequency();return0;}int main( int argc, char ** argv ){int max_test_loops = 100;vector<string> paths = getFiles(argv[1]);max_test_loops = paths.size() < max_test_loops? paths.size() : max_test_loops;double t_read=0, t_write=0, t_decode=0, t_encode=0, encode_ratio=0, psnr=0;for( int i=0;i!=max_test_loops; ++i ){calPsnr(paths[i], argv[2], t_read, t_write, t_decode, t_encode, encode_ratio, psnr);}printf("Test picture compression format %s:\n", argv[2]);printf("Time of reading : %.2lf ms\n", 1000.0*t_read/max_test_loops);printf("Time of writing : %.2lf ms\n", 1000.0*t_write/max_test_loops);printf("Time of decoding : %.2lf ms\n", 1000.0*t_decode/max_test_loops);printf("Time of encoding : %.2lf ms\n", 1000.0*t_encode/max_test_loops);printf("Encode radio : %.2lf%% \n", encode_ratio/max_test_loops);printf("Psnr : %.2lf \n\n", psnr/max_test_loops);return0;}。
嵌入式Linux系统的图片解码和显示方法详解
嵌入式Linux系统的图片解码和显示方法详解嵌入式Linux系统的发展,使得我们可以在嵌入式设备上实现更多的功能,比如图片的解码和显示。
本文将详细介绍嵌入式Linux系统中的图片解码和显示方法。
一、图片解码方法在嵌入式Linux系统中,常见的图片格式包括JPEG、PNG、BMP 等。
为了在嵌入式设备上显示这些图片,我们首先需要将它们解码为设备可以识别的格式,比如RGB格式。
1. 使用开源库在嵌入式Linux系统上,我们可以使用开源的图片解码库来实现图片解码功能。
常用的开源库包括libjpeg、libpng和libbmp等。
这些库提供了对应的API接口,可以方便地将不同格式的图片解码为RGB格式,以供后续的显示操作使用。
2. 自行编写解码算法除了使用开源库外,我们还可以自行编写解码算法来实现图片解码功能。
这需要对不同的图片格式有一定的了解,并根据具体的格式规范进行解码操作。
相比于使用开源库,自行编写解码算法可以更加灵活,但也需要更多的工作量和时间投入。
二、图片显示方法在将图片解码为RGB格式后,我们需要将其在嵌入式设备上显示出来。
下面将介绍两种常见的图片显示方法。
1. 使用帧缓冲设备Linux系统中的帧缓冲设备是一种特殊的设备文件,可以直接对其进行读写操作,实现图形的显示。
我们可以将解码后的RGB数据写入帧缓冲设备文件中,就可以在嵌入式设备的屏幕上显示出来。
使用帧缓冲设备显示图片的方法相对简单,但需要对嵌入式设备的硬件进行适配。
2. 使用图形库除了使用帧缓冲设备外,我们还可以使用图形库来实现图片的显示。
常用的图形库包括DirectFB、Qt和GTK等。
这些图形库提供了丰富的图形界面功能,可以方便地在嵌入式设备上显示图片,并且支持更多的图形效果和交互操作。
使用图形库显示图片的方法相对复杂,但可以获得更好的用户体验。
三、优化方法在嵌入式Linux系统中,由于硬件资源有限,对于图片解码和显示功能的性能优化非常重要。
BMP是什么格式?BMP文件特点及打开方式
BMP是一种位图文件格式,也叫做设备无关位图格式(DIB),是由微软公司开发的一种图片文件格式。
BMP格式文件保存了每个像素点的RGB值,图像保留了细节和颜色信息,但是会占用较大的存储空间,不利于网络传输和储存。
BMP格式通常用于Windows系统中的图标、位图等图形文件的存储。
BMP格式的特点1. BMP格式采用无损压缩算法,保存了每个像素点的颜色信息,通过像素点映射可以对图像还原出非常精细的细节信息。
2. BMP格式支持多种颜色模式,能够处理24位色、16位色、8位色以及黑白两种颜色模式的图像。
3. BMP格式文件由于保存了每个像素点的信息,所以文件较大,在存储和传输时会占用较大的带宽和存储空间。
4. BMP格式文件结构比较简单,只需要保存每个像素点的信息、文件头和文件信息头即可,因此可以被多种不同类型的应用程序轻松支持和读取。
BMP格式是一种可靠、简单、易于编辑和处理的文件格式,但同时也具有文件大小较大的缺点。
BMP格式的优点1. BMP格式采用无损压缩算法,保存了每个像素点的颜色信息,保证了图像的质量,不损失像素的信息,更为精细得显示图像。
2. BMP格式保存的图像具有较高的色彩深度,可以保存具有更加丰富色彩的图像,更能满足高质量图片的需求。
3. BMP格式简单明了,存储图像时方便读写。
其文件结构非常简单,只需要保存每个像素点的信息、文件头和文件信息头即可,因此可以被多种不同类型的应用程序轻松支持和读取。
4. BMP格式被广泛应用于各种不同的平台和设备,特别是在Windows系统里经常使用。
无论是应用于基于Windows的PC机还是嵌入式应用在诸如ATM机端等各类设备,BMP格式都有着良好的兼容性与共通性。
综上所述,BMP格式具有不受损图像质量、高色深图像存储、简单明了以及广泛适用等优点,使得BMP格式被广泛应用于各类应用场景中。
BMP格式的缺点1. BMP格式文件通常比其他格式的图片文件要大,这意味着它对存储空间和网络传输会带来额外的负担。
关于BMP解码为RGB565并在LCD上显示
关于BMP解码为RGB565并在LCD上显⽰开发环境:Keil uVersion5平台:N32903, NonOS, 480x272 LCD⼀. BMP⽂件格式:这⾥主要说说24位BMP。
BMP⽂件的数据按照从⽂件头开始的先后顺序分为四个部分:Ø bmp⽂件头(bmp file header):提供⽂件的格式、⼤⼩等信息Ø 位图信息头(bitmap information):提供图像数据的尺⼨、位平⾯数、压缩⽅式、颜⾊索引等信息Ø 调⾊板(color palette):可选,如使⽤索引来表⽰图像,调⾊板就是索引与其对应的颜⾊的映射表Ø 位图数据(bitmap data):就是图像数据啦^_^下⾯结合Windows结构体的定义,通过⼀个表来分析这四个部分。
我们⼀般见到的图像以24位图像为主,即R、G、B三种颜⾊各⽤8个bit来表⽰,这样的图像我们称为真彩⾊,这种情况下是不需要调⾊板的,也就是所位图信息头后⾯紧跟的就是位图数据了。
因此,我们常常见到有这样⼀种说法:位图⽂件从⽂件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。
这也就解释了我们按照这种程序写出来的程序为什么对某些位图⽂件没⽤了。
⼀、bmp⽂件头Windows为bmp⽂件头定义了如下结构体:typedef struct tagBITMAPFILEHEADER{UINT16 bfType;DWORD bfSize;UINT16 bfReserved1;UINT16 bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER;其中:⼆、位图信息头同样地,Windows为位图信息头定义了如下结构体:需要特别注意的是: biHeight不仅代表图⽚的⾼度,还描述了位图是否是熟直倒向的,及如果biHeight为正,则图⽚是颠倒的,解码时需要从下往上解码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BMP图片解码//************************************************************************** ***////* 数码相框//*控制芯片:ATmgea128//*开发环境:AVR Studio+GCC//*隶属模块:位图解码//*设计者:桃子//************************************************************************** ***//#include "bmp.h"extern unsigned char buffer[512]; //文件系统数据缓冲extern FATFS fs; //文件系统结构extern FIL fl; //文件状态信息extern FRESULT res; //文件返回值extern unsigned int r; //文件读取数量//****************************************************************//*隶属模块:BMP解码//*函数功能:小端转大端//****************************************************************UINT32 bmp_LE2BE(UINT8 *dat,UINT8 len){UINT32 temp=0;if(len>= 1) temp = (UINT32)dat[0];if(len>= 2) temp |= (UINT32)dat[1]<<8;if(len>= 3) temp |= (UINT32)dat[2]<<16;if(len>= 4) temp |= (UINT32)dat[3]<<24;return temp;}//****************************************************************//*隶属模块:BMP解码//*函数功能:单灰BMP解码显示//*注意:图片宽度最好小于208//****************************************************************void BMP_1(unsigned int x0,unsigned int y0,unsigned char type){unsigned int j;unsigned char k=0;if(BMP.bmp_width& 0x001f)BMP.bmp_width +=32 - (BMP.bmp_width& 0x001f);if(type)TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);else{x0 = (240 - BMP.bmp_width)/2;y0 = (320 - BMP.bmp_hight)/2;TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);}while(1){res = f_read(&fl,buffer,512,&r);if(res || r==0) break;for(j=0;j<r;j++){for(k=8;k;k--){if(buffer[j] & (1 << (k-1)))TFT_Write_Data(0x00,0x00);elseTFT_Write_Data(0xff,0xff);}}}}//****************************************************************//*隶属模块:BMP解码//*函数功能:16位灰BMP解码显示//*注意:图片宽度最好小于232//****************************************************************void BMP_4(unsigned int x0,unsigned int y0,unsigned char type){unsigned int j;unsigned char color_H,color_L,i;const unsigned char table_RBGcolor[16] = {0xff,0xee,0xdd,0xcc,0xbb,0xaa,//经查表RGB三像素相同0x99,0x88,0x77,0x66,0x55,0x44,//从白到黑FF~00共16个0x33,0x22,0x11,0x00}; //段if(BMP.bmp_width& 0x0007)BMP.bmp_width +=8 - (BMP.bmp_width& 0x007);if(type)TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);else{x0 = (240 - BMP.bmp_width)/2;y0 = (320 - BMP.bmp_hight)/2;TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);}while(1){res = f_read(&fl,buffer,512,&r);if(res || r==0) break;for(j=0;j<r;j++){i = buffer[j]>> 4;color_H = (table_RBGcolor[i] & 0xf8) | (table_RBGcolor[i] >> 5);color_L = ((table_RBGcolor[i] << 3) & 0xe0) | (table_RBGcolor[i] >> 3);TFT_Write_Data(color_H,color_L);i = buffer[j]& 0x0f;color_H = (table_RBGcolor[i] & 0xf8) | (table_RBGcolor[i] >> 5);color_L = ((table_RBGcolor[i] << 3) & 0xe0) | (table_RBGcolor[i] >> 3);TFT_Write_Data(color_H,color_L);}}}//****************************************************************//*隶属模块:BMP解码//*函数功能:256位灰BMP解码显示//*注意:图片宽度最好小于236//****************************************************************void BMP_8(unsigned int x0,unsigned int y0,unsigned char type){const unsigned char table_Bcolor[4] = {0x00,0x55,0xaa,0xff};//经查表R像素const unsigned char table_GRcolor[8] = {0x00,0x24,0x48,0x6d,0x91,0xb6,0xda,0xff};//经查表GB像素相同unsigned int j;unsigned char color_H,color_L;if(BMP.bmp_width& 0x0003)BMP.bmp_width +=4 - (BMP.bmp_width& 0x03);if(type)TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);else{x0 = (240 - BMP.bmp_width)/2;y0 = (320 - BMP.bmp_hight)/2;TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);}while(1){res = f_read(&fl,buffer,512,&r);if(res || r==0) break;for(j=0;j<r;j++){color_H = (table_Bcolor[buffer[j]>>6] & 0xf8) | (table_GRcolor[(buffer[j] & 0x38)>>3] >> 5); color_L = ((table_GRcolor[(buffer[j] & 0x38)>>3] << 3) & 0xe0) | (table_GRcolor[buffer[j] & 0x07] >> 3);TFT_Write_Data(color_H,color_L);}}}//****************************************************************//*隶属模块:BMP解码//*函数功能:16位真彩BMP解码显示//****************************************************************void BMP_16(unsigned int x0,unsigned int y0,unsigned char type){unsigned int j=0;unsigned inttemp_color=0;if(BMP.bmp_width& 0x0001)BMP.bmp_width +=1;if(type)TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);else{x0 = (240 - BMP.bmp_width)/2;y0 = (320 - BMP.bmp_hight)/2;TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);}while(1){res = f_read(&fl,buffer,512,&r);if(res || r==0) break;for(j=0;j<r;j+=2){temp_color = ((buffer[j]&0xE0)<<1)|(buffer[j]&0x1F);TFT_Write_Data((buffer[j+1]<<1)|(temp_color>>8),temp_color&0x00FF);}}}//**************************************************************** //*隶属模块:BMP解码//*函数功能:24位真彩BMP解码显示//**************************************************************** void BMP_24(unsigned int x0,unsigned int y0,unsigned char type){unsigned int j=0;unsigned char temp[2];if(BMP.bmp_width& 0x0003)BMP.bmp_width +=4 - (BMP.bmp_width& 0x03);if(type)TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);else{x0 = (240 - BMP.bmp_width)/2;y0 = (320 - BMP.bmp_hight)/2;TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);}while(1){res = f_read(&fl,buffer,512,&r);if(res || r==0) break;temp[0] = buffer[510];temp[1] = buffer[511];for(j=0;j<r-2;j+=3){TFT_Write_Data((buffer[j+2]&0xf8)|(buffer[j+1]>>5),((buffer[j+1]<<3)&0xe0)|(buffer[j]>>3));}res = f_read(&fl,buffer,512,&r);if(res || r==0) break;TFT_Write_Data((buffer[0]&0xf8)|(temp[1]>>5),((temp[1]<<3)&0xe0)|(temp[0]>>3));temp[0] = buffer[511];for(j=1;j<r-1;j+=3){TFT_Write_Data((buffer[j+2]&0xf8)|(buffer[j+1]>>5),((buffer[j+1]<<3)&0xe0)|(buffer[j]>>3));}res = f_read(&fl,buffer,512,&r);if(res || r==0) break;TFT_Write_Data((buffer[1]&0xf8)|(buffer[0]>>5),((buffer[0]<<3)&0xe0)|(temp[0]>>3));for(j=2;j<r;j+=3){TFT_Write_Data((buffer[j+2]&0xf8)|(buffer[j+1]>>5),((buffer[j+1]<<3)&0xe0)|(buffer[j]>>3));}}}//**************************************************************** //*隶属模块:BMP解码//*函数功能:32位真彩BMP解码显示//**************************************************************** void BMP_32(unsigned int x0,unsigned int y0,unsigned char type){unsigned int j=0;if(type)TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);else{x0 = (240 - BMP.bmp_width)/2;y0 = (320 - BMP.bmp_hight)/2;TFT_Windons(x0,x0+BMP.bmp_width-1,y0,y0+BMP.bmp_hight-1);}while(1){res = f_read(&fl,buffer,512,&r);if(res || r==0) break;for(j=0;j<r;j+=4){TFT_Write_Data((buffer[j+2]&0xf8)|(buffer[j+1]>>5),((buffer[j+1]<<3)&0xe0)|(buffer[j]>>3));}}}//**************************************************************** //*隶属模块:BMP解码//*函数功能:BMP图片格式解码//**************************************************************** void dis_bmp(unsigned int x0,unsigned int y0,unsigned char type){do{res = f_read(&fl,buffer,512,&r);//读512个数据}while(res || r==0);BMP.bmp_offset = bmp_LE2BE((buffer + 10),4);//数据偏移量BMP.bmp_width = (UINT16)(bmp_LE2BE((buffer + 18),4));//图像宽度BMP.bmp_hight = (UINT16)(bmp_LE2BE((buffer + 22),4));//说明图像高度BMP.bmp_form = (UINT16)(bmp_LE2BE((buffer + 28),2));//说明图像格式do{res = f_lseek(&fl,BMP.bmp_offset);}while(res);if(type == 2){BMP.bmp_width>>= 1;BMP.bmp_hight >>= 1;}else if(type == 4){BMP.bmp_width>>= 2;BMP.bmp_hight >>= 2;}switch(BMP.bmp_form){case 1: BMP_1(x0,y0,type); break;case 4: BMP_4(x0,y0,type); break;case 8: BMP_8(x0,y0,type); break;case 16:BMP_16(x0,y0,type);break;case 24:BMP_24(x0,y0,type);break;case 32:BMP_32(x0,y0,type);break;default:break;}f_close(&fl);f_mount(0,NULL);}。