linux的bmp代码
- 格式:docx
- 大小:30.75 KB
- 文档页数:16
嵌入式Linux系统中图片解码和显示的图像压缩方法在嵌入式Linux系统中,图片解码和显示是一个重要的功能需求。
然而,由于嵌入式设备的资源受限,图像数据的传输和存储需要考虑到空间和带宽的限制。
因此,图像压缩方法在嵌入式系统中扮演着至关重要的角色。
本文将介绍嵌入式Linux系统中常用的图像压缩方法,包括JPEG和PNG,它们分别适用于不同的应用场景。
一、JPEG图像压缩方法JPEG(Joint Photographic Experts Group)是一种广泛使用的图像压缩标准,特别适用于压缩彩色照片。
在嵌入式Linux系统中,JPEG图像压缩方法常用于相机、智能手机等设备中的图像处理。
JPEG压缩方法的核心思想是去除图像中的冗余信息,以减小存储空间和传输带宽。
1. 图像压缩算法:JPEG图像压缩算法主要由离散余弦变换(DCT)和量化过程组成。
首先,将图像分为8x8的图像块,通过DCT将每个图像块从空间域转换为频域。
然后,对于每个频域系数,进行量化操作。
量化操作是将频域系数按照一组固定的量化表进行舍入和缩放,以降低高频部分的精度。
最后,通过经过量化的频域系数进行反变换(IDCT),将图像从频域恢复到空间域。
2. 压缩比与图像质量的权衡:JPEG图像压缩方法通过调整量化表的选择和量化系数的大小来平衡压缩比和图像质量。
较高的量化系数可得到更高的压缩比,但会导致图像质量的损失。
相反,较低的量化系数可提高图像质量,但降低了压缩比。
在嵌入式系统中,开发者需要根据实际应用需求进行权衡和选择。
二、PNG图像压缩方法PNG(Portable Network Graphics)是一种无损压缩格式的图像文件,适用于需要精确还原图像信息的应用场景。
PNG图像压缩方法常用于嵌入式Linux系统中需要保留图像质量的领域,如医疗设备、航空航天等。
1. 图像压缩算法:PNG图像压缩算法利用了两种压缩技术:基于LZ77的数据压缩和Huffman编码。
嵌入式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系统图片解码和显示是指在嵌入式设备上通过软件解码并显示图片的过程。
嵌入式设备通常具有较小的内存和处理能力,因此需要采用一定的方法来实现对图片的解码和显示操作。
二、嵌入式Linux系统图片解码常见问题解答1. 图片格式支持嵌入式Linux系统支持的图片格式包括但不限于JPEG、PNG、BMP等。
对于不同的图片格式,解码算法也有所不同。
在选择嵌入式Linux系统时需确保其支持所需的图片格式。
2. 图片解码算法选择嵌入式Linux系统可以采用硬解码或软解码算法来实现图片解码。
硬解码通常需要专门的硬件支持,而软解码则依靠嵌入式设备的处理器来完成。
在选择解码算法时,需根据具体应用需求和设备特性来做出决策。
3. 图片解码性能优化由于嵌入式设备的资源有限,对图片解码性能的优化显得尤为重要。
常见的优化手段包括使用高效的解码算法、减小图片文件大小以及合理配置解码参数等。
同时,还可以通过提高嵌入式设备的处理能力来获得更好的解码性能。
三、嵌入式Linux系统图片显示常见问题解答1. 图片显示驱动选择嵌入式Linux系统可以通过不同的显示驱动来实现图片的显示功能。
常见的显示驱动包括Framebuffer驱动、Xwindow系统、DirectFB等。
选择合适的显示驱动需考虑嵌入式设备的硬件架构、软件支持等因素。
2. 图片显示接口嵌入式Linux系统可以通过不同的接口来连接显示设备,如LVDS、HDMI、VGA等。
选择合适的显示接口需要与硬件设备的兼容性和应用场景进行综合考虑。
3. 图片显示性能优化图片显示性能的优化关乎整个系统的响应速度和用户体验。
嵌入式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系统中,图片的显示可以通过多种方式实现。
编译linux 源代码
编译 Linux 源代码需要以下步骤:
1.下载 Linux 源代码
可以从官方网站或者其它可靠的源下载 Linux 源代码。
2.解压源代码
使用解压工具将下载的源代码解压到一个目录下。
3.配置编译环境
在终端中输入以下命令来配置编译环境:
bash复制代码
export ARCH=arm64 # 根据自己的硬件架构选择合适的架构
export CROSS_COMPILE=arm64-linux-gnueabi- # 根据自己的硬件架构选择合适的编译器前缀
4.执行编译命令
在终端中输入以下命令来执行编译:
bash复制代码
make menuconfig # 配置内核选项,按上下键选择需要的选项,按空格键进行确认/取消选择,按Y 键保存更改,最后按 Esc 键退出配置菜单。
make # 开始编译内核,等待编译完成。
5.等待编译完成
编译完成后,会在arch/$ARCH/boot/目录下生成一个名为Image的文件,这就是编译好的 Linux 内核映像文件。
linux源代码分析Linux源代码是Linux操作系统的基础,它是开源的,其源代码可以被任何人查看、分析和修改。
Linux源代码的分析对于了解Linux操作系统的原理和机制非常有帮助。
在本文中,我将对Linux源代码进行分析,介绍其结构、特点以及一些常见的模块。
首先,我们来了解一下Linux源代码的目录结构。
Linux源代码的根目录是一个包含各种子目录的层次结构。
其中,arch目录包含了与硬件体系结构相关的代码;block目录包含了与块设备相关的代码;fs目录包含了文件系统相关的代码等等。
每个子目录下又有更详细的子目录,以及各种源代码文件。
Linux源代码的特点之一是它的模块化。
Linux操作系统是由许多独立的模块组成的,每个模块负责完成特定的功能。
这种模块化的设计使得Linux操作系统更容易理解和维护。
例如,网络模块负责处理与网络相关的功能,文件系统模块负责处理文件系统相关的功能,设备驱动程序模块负责处理硬件设备的驱动等等。
通过分析这些模块的源代码,我们能够深入了解Linux操作系统的各个功能组成。
在Linux源代码中,有一些常见的模块是非常重要的,例如进程调度模块、内存管理模块和文件系统模块。
进程调度模块负责为不同的进程分配CPU时间,实现多任务处理能力。
内存管理模块负责管理系统的内存资源,包括内存的分配和释放。
文件系统模块负责处理文件的读写操作,提供文件系统的功能。
通过对这些重要模块的源代码进行分析,我们可以更加全面地了解Linux操作系统的内部工作原理。
除了这些模块以外,Linux源代码还包含了许多其他的功能和模块,例如设备驱动程序、网络协议栈、系统调用等等。
这些模块共同组成了一个完整的操作系统,为用户提供了丰富的功能和服务。
对于分析Linux源代码,我们可以使用一些工具和方法来辅助。
例如,我们可以使用文本编辑器来查看和修改源代码文件,使用编译器来编译和运行代码,使用调试器来调试代码等等。
BMP(Bitmap Image File)是一种位图图像文件格式,它的编码规则如下:
1. BMP文件格式由文件头、位图信息头、颜色表和位图数据四部分组成。
2. 文件头包括两个字节的文件类型标识和四个字节的文件大小。
其中,文件类型标识固定为0x4d42,即"BM"。
3. 位图信息头包括14个字节的信息,包括位图宽度、位图高度、像素位数、压缩方式等。
4. 颜色表用于存储位图中的颜色信息,它由若干个RGBQUAD结构组成。
每个RGBQUAD结构包含红色、绿色、蓝色和保留字段,其中保留字段用于填充位图数据中的空隙。
5. 位图数据是位图中每个像素值的序列,按照扫描行内从左到右、扫描行之间从下到上的顺序记录。
需要注意的是,BMP文件的编码方式有多种,包括不压缩、RLE压缩等。
不同的编码方式会影响到BMP文件的存储大小和显示效果。
Bootsect.s(1-9)!! SYS_SIZE is the number of clicks (16 bytes) to be loaded.! 0x3000 is 0x30000 bytes = 196kB, more than enough for current! versions of linux ! SYS_SIZE 是要加载的节数(16 字节为1 节)。
0x3000 共为1 2 3 4 5 60x7c000x00000x900000x100000xA0000system 模块代码执行位置线路0x90200! 0x30000 字节=192 kB(上面Linus 估算错了),对于当前的版本空间已足够了。
!SYSSIZE = 0x3000 ! 指编译连接后system 模块的大小。
参见列表1.2 中第92 的说明。
! 这里给出了一个最大默认值。
!! bootsect.s (C) 1991 Linus Torvalds!! bootsect.s is loaded at 0x7c00 by the bios-startup routines, and moves! iself out of the way to address 0x90000, and jumps there.!! It then loads 'setup' directly after itself (0x90200), and the system! at 0x10000, using BIOS interrupts.!! NOTE! currently system is at most 8*65536 bytes long. This should be no! problem, even in the future. I want to keep it simple. This 512 kB! kernel size should be enough, especially as this doesn't contain the! buffer cache as in minix!! The loader has been made as simple as possible, and continuos! read errors will result in a unbreakable loop. Reboot by hand. It! loads pretty fast by getting whole sectors at a time whenever possible.!! 以下是前面这些文字的翻译:! bootsect.s (C) 1991 Linus Torvalds 版权所有!! bootsect.s 被bios-启动子程序加载至0x7c00 (31k)处,并将自己! 移到了地址0x90000 (576k)处,并跳转至那里。
linux gimp使用指令
GIMP(GNU Image Manipulation Program)是一个开源的图像编辑软件,可以在Linux系统上使用。
以下是一些常用的GIMP 指令:
1. 打开图像文件:`gimp filename.jpg`
2. 创建新图像:`gimp -n -i -b width x height`
3. 导出图像为PNG格式:`File > Export As > PNG`
4. 保存图像为JPEG格式:`File > Export As > JPEG`
5. 裁剪图像:`Image > Crop to Selection`
6. 调整图像大小:`Image > Scale Image`
7. 添加文本:`Text Tool`(工具栏中的文字工具)
8. 撤销操作:`Edit > Undo`
9. 重做操作:`Edit > Redo`
10. 剪切图像:`Edit > Cut`
11. 复制图像:`Edit > Copy`
12. 粘贴图像:`Edit > Paste`
13. 填充颜色:`Paint Tools > Foreground Color`(前景色工具)
14. 选择颜色:`Color Picker`(颜色选择器)
15. 图层操作:在图层面板中,可以创建、删除、合并和调整图层的顺序等。
这些指令只是GIMP的基本功能,更多高级功能可以通过菜单栏和工具栏进行操作。
linux 的编码格式摘要:1.Linux 的编码格式简介2.Linux 中常用的编码格式3.Linux 编码格式设置方法4.编码格式对Linux 系统的影响5.总结正文:Linux 的编码格式--------------------Linux 是一种开源的操作系统,由于其跨平台的特点,被广泛应用于服务器、嵌入式设备等多个领域。
在Linux 系统中,编码格式是用来表示文本的方式,不同的编码格式会影响到文本的显示、存储和传输。
本文将对Linux 的编码格式进行详细介绍。
Linux 中常用的编码格式------------------------在Linux 系统中,常用的编码格式有以下几种:1.ASCII 编码:ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最早的编码格式,可以表示128 个字符,包括数字、字母和一些符号。
2.ISO-8859-1 编码:也称为Latin-1 编码,是ISO-8859 系列编码的一部分,可以表示256 个字符,包括西欧语言的基本字符和一些符号。
3.UTF-8 编码:UTF-8(Universal Character Set Transformation Format 8)是一种通用的编码格式,可以表示世界上几乎所有的字符。
UTF-8 编码采用可变长度的编码方式,具有很好的兼容性和可扩展性。
4.UTF-16 编码:UTF-16 是Unicode 字符集的一种编码方式,采用16 位编码,可以表示Unicode 字符集中的所有字符。
5.UTF-32 编码:UTF-32 是Unicode 字符集的另一种编码方式,采用32 位编码,可以表示Unicode 字符集中的所有字符。
Linux 编码格式设置方法----------------------在Linux 系统中,可以通过以下方法设置编码格式:1.文件编码:在创建或编辑文件时,可以使用文本编辑器(如vim、gedit 等)设置文件的编码格式。
//////////////////////////////////////////////////bmp.c///////////////////////////////////////////// ///////////////////////////////////*fbv -- simple image viewer for the linuxframebufferCopyright (C) 2002 Tomasz SternaThis program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "config.h"#ifdef FBV_SUPPORT_BMP#include "fbv.h"#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define BMP_TORASTER_OFFSET 10#define BMP_SIZE_OFFSET 18#define BMP_BPP_OFFSET 28#define BMP_RLE_OFFSET 30#define BMP_COLOR_OFFSET54#define fill4B(a) ( ( 4 - ( (a) % 4 ) ) & 0x03)struct color {unsigned char red;unsigned char green;unsigned char blue;};intfh_bmp_id(char *name)//读取位图头信息,判断是否为"BM"intfd;char id[2];fd = open(name, O_RDONLY);//打开文件if (fd == -1) {return(0);}read(fd, id, 2);close(fd);if ( id[0]=='B' && id[1]=='M' ) {return(1);}return(0);}void fetch_pallete(intfd, struct color pallete[], int count)//获取调色板信息{unsigned char buff[4];int i;lseek(fd, BMP_COLOR_OFFSET, SEEK_SET);//fd,28,SEEK_SET:参数28为新的读写位置for (i=0; i<count; i++) {read(fd, buff, 4);//将fd所指向的文件的4个字节传送给缓冲区(指针)buff所指内存中pallete[i].red = buff[2];pallete[i].green = buff[1];pallete[i].blue = buff[0];}return;}intfh_bmp_load(char *name,unsigned char *buffer, unsigned char **alpha, intx,int y){#if 1intfd, bpp, raster, i, j, k, skip;unsigned char buff[4];unsigned char *wr_buffer = buffer + x*(y-1)*3;struct color pallete[256];fd = open(name, O_RDONLY);if (fd == -1) {return(FH_ERROR_FILE);}if (lseek(fd, BMP_TORASTER_OFFSET, SEEK_SET) == -1) {//从文件10处开始读写return(FH_ERROR_FORMAT);}read(fd, buff, 4);raster = buff[0] + (buff[1]<<8) + (buff[2]<<16) + (buff[3]<<24);//由上面可知:从bfOffBits//开始四个字节:每一行扫描的字节数?if (lseek(fd, BMP_BPP_OFFSET, SEEK_SET) == -1) {return(FH_ERROR_FORMAT);}read(fd, buff, 2);bpp = buff[0] + (buff[1]<<8);//可得biBitCount(从28开始2个字节)switch (bpp){case 1: /* monochrome 单色*/skip = fill4B(x/8+(x%8?1:0));/*#define fill4B(a) ( ( 4 - ( (a) % 4 ) ) & 0x03)1.BMP文件记录一行图像是以字节为单位的。
因此,就不存在一个字节中的数据位信息表示的点在不同的两行中。
也就是说,设显示模式位16色,在每个字节分配两个点信息时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。
接下来的一个字节将开始记录下一行的信息。
2.为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“00”补齐为4的整数倍。
如果显示模式为16色,当图像宽为19时,存储时每行则要补充4-(19/2+1)%4=2个字节(加1是因为里面有一个像素点要独占了一字节)。
如果显示模式为256色,当图像宽为19时,每行也要补充4-19%4=1个字节。
*/lseek(fd, raster, SEEK_SET);for (i=0; i<y; i++) {for (j=0; j<x/8; j++) {read(fd, buff, 1);for (k=0; k<8; k++) {if (buff[0] & 0x80) {*wr_buffer++ = 0xff;*wr_buffer++ = 0xff;*wr_buffer++ = 0xff;} else {*wr_buffer++ = 0x00;*wr_buffer++ = 0x00;*wr_buffer++ = 0x00;}buff[0] = buff[0]<<1;}}if (x%8) {read(fd, buff, 1);for (k=0; k<x%8; k++) {if (buff[0] & 0x80) {*wr_buffer++ = 0xff;*wr_buffer++ = 0xff;*wr_buffer++ = 0xff;} else {*wr_buffer++ = 0x00;*wr_buffer++ = 0x00;*wr_buffer++ = 0x00;}buff[0] = buff[0]<<1;}}if (skip) {read(fd, buff, skip);}wr_buffer -= x*6; /* backoff 2 lines - x*2 *3 */}break;case 4: /* 4bit palletized */skip = fill4B(x/2+x%2);//#define fill4B(a) ( ( 4 - ( (a) % 4 ) ) & 0x03) fetch_pallete(fd, pallete, 16);lseek(fd, raster, SEEK_SET);for (i=0; i<y; i++) {for (j=0; j<x/2; j++) {read(fd, buff, 1);buff[1] = buff[0]>>4;buff[2] = buff[0] & 0x0f;*wr_buffer++ = pallete[buff[1]].red;*wr_buffer++ = pallete[buff[1]].green;*wr_buffer++ = pallete[buff[1]].blue;*wr_buffer++ = pallete[buff[2]].red;*wr_buffer++ = pallete[buff[2]].green;*wr_buffer++ = pallete[buff[2]].blue;}if (x%2) {read(fd, buff, 1);buff[1] = buff[0]>>4;*wr_buffer++ = pallete[buff[1]].red;*wr_buffer++ = pallete[buff[1]].green;*wr_buffer++ = pallete[buff[1]].blue;}if (skip) {read(fd, buff, skip);}wr_buffer -= x*6; /* backoff 2 lines - x*2 *3 */ }break;case 8: /* 8bit palletized */skip = fill4B(x);fetch_pallete(fd, pallete, 256);lseek(fd, raster, SEEK_SET);for (i=0; i<y; i++) {for (j=0; j<x; j++) {read(fd, buff, 1);*wr_buffer++ = pallete[buff[0]].red;*wr_buffer++ = pallete[buff[0]].green;*wr_buffer++ = pallete[buff[0]].blue;}if (skip) {read(fd, buff, skip);}wr_buffer -= x*6; /* backoff 2 lines - x*2 *3 */ }break;case 16: /* 16bit RGB */return(FH_ERROR_FORMAT);break;case 24: /* 24bit RGB */skip = fill4B(x*3);lseek(fd, raster, SEEK_SET);for (i=0; i<y; i++) {for (j=0; j<x; j++) {read(fd, buff, 3);*wr_buffer++ = buff[2];*wr_buffer++ = buff[1];*wr_buffer++ = buff[0];}if (skip) {read(fd, buff, skip);}wr_buffer -= x*6; /* backoff 2 lines - x*2 *3 */}break;default:return(FH_ERROR_FORMAT);}close(fd);return(FH_ERROR_OK);#endif}intfh_bmp_getsize(char *name,int *x,int *y){intfd;unsigned char size[4];fd = open(name, O_RDONLY);if (fd == -1) {return(FH_ERROR_FILE);//宏定义FH_ERROR_FILE 1; 见fbv.h}if (lseek(fd, BMP_SIZE_OFFSET, SEEK_SET) == -1) {//BMP_SIZE_OFFSET :28return(FH_ERROR_FORMAT);//FH_ERROR_FORMAT:2}read(fd, size, 4);*x = size[0] + (size[1]<<8) + (size[2]<<16) + (size[3]<<24);// *x-=1;read(fd, size, 4);*y = size[0] + (size[1]<<8) + (size[2]<<16) + (size[3]<<24);close(fd);return(FH_ERROR_OK);}#endif//////////////////////////////////////////////////bmp.c///////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////main.c///////////////////////////////////////////// //////////////////////////////////#include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <getopt.h>#include <termios.h>#include <string.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <asm/mman.h>#include <linux/fb.h>#include <pthread.h>#include <semaphore.h>#include <errno.h>#include <dirent.h>#include <linux/input.h>#include <linux/rtc.h>#include "config.h"#include "fbv.h"#include <sys/syscall.h>#include <unistd.h>#if 1#define UI_w 240#define UI_h 320/////////unsigned char *fbdis = 0;///////////staticintopt_clear = 1,opt_alpha = 0,opt_hide_cursor = 1,opt_image_info = 1,opt_stretch = 0,opt_delay = 0,opt_enlarge = 0,opt_ignore_aspect = 0;intcmp;voiddisplay_rgb( unsigned char * dis_data,intW,int H){staticintfbfd = 0;staticintkh=0;inttfd=0;structfb_var_screeninfovinfo;structfb_fix_screeninfofinfo;int blank=0;longintscreensize = 0;unsigned char * buf;int x = 0, y = 0,z=0;// Open the file for reading and writingfbfd = open("/dev/fb0", O_RDWR);//打开显示设备if (fbfd< 0) {printf("Error: cannot open framebuffer device.\n");exit(1);}// Get fixed screen informationif (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {//printf("Error reading fixed information.\n");exit(2);}// Get variable screen informationif (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {//获取屏的显示信息printf("Error reading variable information.\n");exit(3);}printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel );//vinfo.bits_per_pixel:每个像素//所占比特,也就是biBitCount// Figure out the size of the screen in bytes:计算出屏幕大小,单位bit screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;// Map the device to memory:映射设备到内存/*void *mmap(void *start, size_t length, intprot, int flags, intfd, off_toffsize);mmap()建立内存映射:将某个文件内容映射到内存中,对该内存区域的存取即是对该文件内容的读写。