在Linux控制台下使用libjpeg显示JPEG图像在framebuffer上
- 格式:doc
- 大小:96.00 KB
- 文档页数:17
从入门到精通嵌入式Linux系统中的图片解码和显示嵌入式Linux系统是一种在资源受限的嵌入式设备上运行的操作系统,它在嵌入式行业得到广泛应用。
图片解码和显示是嵌入式Linux系统中常见的功能之一。
本文将介绍从入门到精通嵌入式Linux系统中的图片解码和显示的方法和技巧。
一、使用嵌入式Linux系统的图形库嵌入式Linux系统提供了多个图形库,其中最常用的图形库包括Frame Buffer(帧缓冲)和DirectFB(直接帧缓冲)。
这两个图形库都可以用于图片解码和显示功能。
1. Frame Buffer(帧缓冲)Frame Buffer是Unix系统中最早引入的一个图形接口,它提供了一种将图像数据直接存储在显存中的方法,从而可以直接在屏幕上显示图像。
使用Frame Buffer进行图片解码和显示的方法如下:(1)初始化Frame Buffer设备首先,需要在嵌入式Linux系统中初始化Frame Buffer设备。
可以通过修改系统启动文件来加载Frame Buffer驱动程序,并配置相关参数。
(2)解码图片数据接下来,需要解码图片数据。
可以使用开源的图像库,如libjpeg和libpng,来解码常见的JPEG和PNG格式的图片。
(3)将解码后的图像数据写入Frame Buffer最后,将解码后的图像数据写入Frame Buffer中的显存,从而在屏幕上显示图像。
2. DirectFB(直接帧缓冲)DirectFB是一个轻量级、高性能的图形库,它直接操作帧缓冲设备,提供了更快速和灵活的图像显示功能。
使用DirectFB进行图片解码和显示的方法如下:(1)初始化DirectFB环境首先,需要在嵌入式Linux系统中初始化DirectFB环境。
可以通过加载DirectFB驱动程序,并进行相关配置来实现。
(2)解码图片数据同样,使用开源的图像库,如libjpeg和libpng,来解码JPEG和PNG格式的图片。
嵌入式Linux系统中图片解码和显示的最佳编程实践嵌入式Linux系统是应用广泛的操作系统,拥有强大的图像处理能力。
在这样的系统上实现高效的图片解码和显示是开发者面临的重要挑战。
本文将介绍在嵌入式Linux系统中图片解码和显示的最佳编程实践。
一、图像解码图像解码是将图片由编码格式转换为可供显示的数据的过程。
在嵌入式Linux系统中,我们可以使用多种解码技术,如JPEG、PNG等。
以下是一些图像解码的最佳编程实践:1. 选择适合嵌入式环境的解码库:在选择图像解码库时,我们应考虑到其对系统资源的占用情况。
一些轻量级的解码库如libjpeg-turbo和libpng可以有效地在有限的资源下完成解码任务。
2. 确保解码过程的稳定性:在进行图像解码时,应注意处理异常情况,如解码错误或文件损坏。
合理的错误处理能提高系统的稳定性,避免由于解码错误而导致应用程序崩溃。
3. 优化解码性能:为了提高解码速度和降低系统资源的占用,可以考虑使用硬件加速解码技术,如使用GPU或DSP进行解码。
此外,可以通过多线程或并行处理来提高解码效率。
二、图像显示图像显示是将解码后的图像数据渲染到屏幕上的过程。
在嵌入式Linux系统中,我们可以采用不同的图像显示技术,如使用Framebuffer、DirectFB或DRM等。
以下是一些图像显示的最佳编程实践:1. 使用适合硬件的显示技术:根据系统硬件的特性选择合适的图像显示技术。
例如,如果系统支持FrameBuffer,可以使用其提供的接口进行图像渲染。
2. 避免图像显示的闪烁问题:为了避免图像显示时的闪烁问题,可以采用双缓冲技术。
通过使用两个缓冲区,在一块缓冲区绘制图像的同时,在另一块缓冲区进行显示,从而实现无闪烁的图像显示。
3. 进行图像的缩放和裁剪:根据显示设备的分辨率和图像的大小,可以进行图像的缩放和裁剪,以确保图像在屏幕上的显示完整性和清晰性。
4. 考虑能耗优化:在进行图像显示时,要考虑到系统的能耗优化。
嵌入式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作为一种常用的操作系统,可以为嵌入式设备提供稳定、高效的支持。
在嵌入式Linux系统中,实现高质量图片的解码和显示是一个重要的技术需求。
本文将介绍在嵌入式Linux系统中实现高质量图片解码和显示的方法。
一、选择合适的嵌入式平台在选择嵌入式平台时,需要考虑其处理能力、存储容量和图形处理能力等因素。
较高的处理能力和存储容量可以支持更复杂的图片解码和显示操作,而较强的图形处理能力则可以提供更高质量的图片显示效果。
二、选用适当的解码库和显示驱动1. 解码库的选择针对嵌入式Linux系统,常用的图片解码库有libjpeg、libpng 和libtiff等。
在选择解码库时,需要考虑其对图片格式的支持情况以及解码效率。
根据具体需求,可以选择性能较优的解码库,以提高解码速度和质量。
2. 显示驱动的选择嵌入式系统中常用的显示驱动包括framebuffer和DirectFB等。
framebuffer是Linux中标准的显示子系统,可以提供基本的图形操作接口。
DirectFB是一种高效的图形加速层,可以提供更强大的图形处理和显示功能。
根据具体需求,选择适合的显示驱动可以提升图片的显示效果和性能。
三、优化图片解码算法为了实现高质量的图片解码,在算法层面上可以进行一些优化:1. 调整解码参数根据图片的特点,可以调整解码库的参数,如色彩空间、采样率等,以获得更好的图片解码效果。
2. 多线程解码通过多线程解码,可以提高解码的效率,减少解码时间,同时提高系统的响应速度。
四、优化图片显示效果在图片显示过程中,可以采取以下措施来提高显示效果:1. 色彩空间转换根据显示设备的色彩空间,进行合适的色彩空间转换,以确保显示的图片颜色准确无误。
2. 图像缓存和双缓冲技术采用图像缓存和双缓冲技术可以减少图像的撕裂和闪烁现象,提高显示效果的流畅度和稳定性。
嵌入式Linux系统中图片解码和显示的跨平台支持技术嵌入式Linux系统在各个领域得到广泛应用,而图片解码和显示是其中重要的功能之一。
随着跨平台需求的增加,如何实现图片解码和显示的跨平台支持成为了一个亟待解决的问题。
本文将介绍一些实现嵌入式Linux系统中图片解码和显示的跨平台支持技术。
一、JPEG解码JPEG(Joint Photographic Experts Group)是一种广泛应用的图像压缩标准。
在嵌入式Linux系统中,实现JPEG解码的跨平台支持需要考虑如下几个方面:1. 软件解码:在嵌入式系统中,软件解码是一种常见的解码方式。
通过使用开源库,如libjpeg等,可以实现JPEG图像的解码,在不同平台上都可以运行。
2. 硬件解码:为了提高解码效率,嵌入式平台通常会配备专用的硬件解码器。
不同平台上的硬件解码器存在差异,因此需要根据具体平台进行适配。
一种常见的做法是使用平台相关的驱动程序,通过编写特定平台的接口来实现跨平台支持。
二、图像显示实现图像显示的跨平台支持主要涉及到以下几个方面:1. 帧缓冲(Framebuffer):在嵌入式Linux系统中,图像显示通常依赖于帧缓冲设备。
帧缓冲是一种存储图像数据的设备,可以直接将图像数据送到显示设备上进行显示。
不同平台的帧缓冲设备存在差异,需要根据具体平台进行适配。
2. 显示驱动程序:为了实现跨平台支持,可以编写平台无关的显示驱动程序。
这样,无论在哪种平台上运行,都可以通过调用相同的接口进行图像显示。
然而,由于不同平台上的显示设备和接口存在差异,因此在编写平台无关的显示驱动程序时需要进行一定的兼容性处理。
三、跨平台支持技术为了实现嵌入式Linux系统中图片解码和显示的跨平台支持,可以采用以下一些技术:1. 抽象接口:通过定义统一的抽象接口,可以屏蔽不同平台间的差异,使得在不同平台上调用接口时可以实现相同的功能。
通过定义适当的抽象接口,可以实现跨平台的JPEG解码和图像显示。
嵌入式Linux系统中图片解码和显示的多屏切换方法在嵌入式Linux系统中,图片解码和显示的多屏切换方法是非常重要的,它允许用户在不同的屏幕之间进行切换,以展示不同的图像内容。
本文将介绍一种常用的多屏切换方法,旨在提供一种有效可行的技术方案。
一、概述在嵌入式Linux系统中,图片解码和显示是基于帧缓冲(Framebuffer)的实现方式。
帧缓冲是一种在软件中模拟视频显示内存的技术,通过控制帧缓冲的内容实现图像的解码和显示。
二、多屏切换方法1. 初始化帧缓冲在进行多屏切换之前,需要先初始化帧缓冲。
通过相关的系统调用,可以获取到帧缓冲的信息,并进行相应的设置。
这些信息包括屏幕分辨率、像素格式等。
2. 图片解码多屏切换需要先对目标图片进行解码,将其转换为帧缓冲所支持的像素格式。
常用的图片解码库包括libjpeg和libpng等,可以选择适合自己需求的库进行解码。
3. 切换屏幕在进行屏幕切换时,需要通过系统调用将待显示的图像数据写入到帧缓冲中。
具体可以使用mmap将帧缓冲映射到用户空间,然后将解码后的图像数据写入帧缓冲的内存中。
这样就可以实现图像在不同屏幕之间的切换。
4. 刷新屏幕当图像数据写入帧缓冲后,需要通过刷新帧缓冲来显示图像。
可以使用相关的系统调用来触发刷新操作,从而将帧缓冲的内容实时显示在屏幕上。
5. 多屏协同在多屏切换时,如果需要多个屏幕同时显示不同的图像,可以通过多线程或多进程的方式进行实现。
每个线程/进程负责一个独立的帧缓冲和屏幕,实现多屏协同切换的效果。
三、技术实现嵌入式Linux系统中,可以使用各种工具和库来实现图片解码和显示的多屏切换。
比如,可以使用Qt等图形库来进行图像的解码和显示,并结合相关的系统调用来实现多屏切换。
1. 使用Qt库Qt是一种跨平台的应用程序开发框架,它提供了丰富的图形图像处理功能。
可以使用Qt库来解码和显示图片,并通过QImage对象将图像数据写入到帧缓冲中。
嵌入式Linux系统中图片解码和显示的实时视频处理现今嵌入式Linux系统在各个领域中得到了广泛的应用,其中之一是嵌入式系统中的图片解码和显示的实时视频处理。
本文将介绍在嵌入式Linux系统中实现图片解码和显示的方法,并探讨实时视频处理的相关技术。
一、图片解码和显示在嵌入式Linux系统中,图片解码和显示常常需要通过图像编解码库来完成,其中最常用的是JPEG和PNG格式。
下面将分别介绍这两种格式的解码和显示方法。
1. JPEG图片解码和显示JPEG是最常见的图像压缩格式之一,它具有良好的压缩比和图像质量。
在嵌入式Linux系统中,我们可以使用libjpeg库来解码和显示JPEG图片。
具体步骤如下:a) 打开JPEG图片文件。
b) 使用libjpeg库读取JPEG图片并解码。
c) 将解码后的图像数据传输到显示设备。
d) 在显示设备上显示解码后的图像。
2. PNG图片解码和显示PNG是另一种常用的图像格式,它支持无损压缩和透明度信息。
在嵌入式Linux系统中,我们可以使用libpng库来解码和显示PNG图片。
具体步骤如下:a) 打开PNG图片文件。
b) 使用libpng库读取PNG图片并解码。
c) 将解码后的图像数据传输到显示设备。
d) 在显示设备上显示解码后的图像。
二、实时视频处理嵌入式Linux系统中的实时视频处理常常需要处理连续的视频帧。
下面将介绍常见的两种实时视频处理技术。
1. 视频流采集视频流采集是指从视频源(例如摄像头)中获取连续的视频帧。
在嵌入式Linux系统中,我们可以使用Video4Linux2(V4L2)驱动接口来实现视频流的采集。
具体步骤如下:a) 打开视频源设备。
b) 配置视频源设备的参数,例如帧率、分辨率等。
c) 循环采集视频帧并处理。
2. 视频帧处理视频帧处理是指对采集到的视频帧进行处理以实现特定的功能。
常见的视频帧处理包括图像滤波、目标检测、图像分割等。
在嵌入式Linux系统中,我们可以使用OpenCV等图像处理库来实现视频帧的处理。
linux 取消framebuff
在Linux 中,如果您想取消framebuffer(帧缓冲设备)支持,您可以按照以下步骤进行操作:
1. 打开终端,以root 或具有管理员权限的用户身份登录。
2. 运行以下命令以编辑内核参数:
vi /etc/default/grub
3. 在打开的文件中,找到以GRUB_CMDLINE_LINUX 开头的行。
在该行的末尾添加以下参数:
nomodeset
这将禁用framebuffer 支持。
4. 保存并关闭文件。
5. 运行以下命令以更新GRUB 配置:
update-grub
这将生成新的GRUB 配置文件。
6. 重新启动计算机以使更改生效。
现在,您的Linux 系统将不再使用framebuffer,而是使用文本模式启动。
请注意,这可能会导致图形界面不可用,因此请确保您了解所做的更改并采取适当的措施。
嵌入式Linux系统中图片解码和显示的高效实现方法嵌入式Linux系统中图片解码和显示的高效实现方法是嵌入式系统开发中一个重要的课题。
随着数字图像的广泛应用,对于嵌入式设备对图像解码和显示的要求也越来越高。
本文将介绍几种常用且高效的嵌入式Linux系统中图片解码和显示的实现方法。
一、JPEG解码与显示JPEG是一种常见的图像压缩格式,用于在嵌入式Linux系统中展示图片。
在嵌入式设备上进行JPEG解码并显示图片,通常使用libjpeg 库。
libjpeg库提供了丰富的API用于JPEG图像解码和显示,可在嵌入式平台上高效地完成这些任务。
二、PNG解码与显示PNG是另一种常见的图像格式,用于在嵌入式Linux系统中展示图片。
与JPEG相比,PNG图像压缩更为无损,图像质量更高。
在嵌入式设备上进行PNG解码并显示图片,通常使用libpng库。
libpng库提供了一组API,用于在嵌入式平台上高效地进行PNG图像解码和显示。
三、硬件加速解码与显示为了提高图像解码和显示的性能,一种高效的方法是使用硬件加速技术。
常见的硬件加速技术有DMA(Direct Memory Access)和GPU (Graphics Processing Unit)。
DMA技术可以实现数据的高速传输,通过直接将图像数据从存储器复制到显存,减少了CPU的负载。
在嵌入式设备上使用DMA技术进行图像解码和显示可以提高实时性和效率。
GPU技术是一种专门用于图像处理的硬件,具有并行计算的能力。
在嵌入式设备上使用GPU进行图像解码和显示可以充分利用GPU的并行性能,提高图像处理速度和质量。
四、压缩算法与实时解码在嵌入式Linux系统中进行图像解码和显示时,为了提高实时性和降低内存占用,可以采用压缩算法和实时解码技术。
常见的图像压缩算法有JPEG和PNG,通过选择合适的图像压缩算法可以在一定程度上降低内存占用和数据传输的带宽。
实时解码技术可以提高图像解码的速度,保证图像可以及时地显示在嵌入式设备的屏幕上。
如何在嵌入式Linux系统中实现图片解码和显示嵌入式Linux系统中的图片解码和显示是一个在现代嵌入式系统中非常常见和重要的功能。
在许多嵌入式应用中,如智能家居、工业自动化或医疗设备等,图像处理是必不可少的。
本文将介绍如何在嵌入式Linux系统中实现图片解码和显示的方法和技术。
一、嵌入式Linux系统概述嵌入式Linux系统是运行在嵌入式设备上的一种精简型操作系统。
与传统的桌面操作系统相比,嵌入式Linux系统具有体积小、资源占用低以及可裁剪性强等特点,非常适用于资源有限的嵌入式设备。
二、图片解码和显示的原理在嵌入式Linux系统中,图片解码和显示涉及到两个主要的过程:图片解码和图像显示。
1. 图片解码图片解码是将存储在文件或内存中的图像数据转换为可供显示的像素数据的过程。
常见的图像格式包括JPEG、PNG和BMP等。
在嵌入式Linux系统中,可以使用各种图像解码库来实现图片解码功能,如libjpeg、libpng和libbmp等。
这些库提供了一组API函数,通过这些函数可以将图像数据解码为像素数据。
2. 图像显示图像显示是将解码后的像素数据在屏幕上显示出来的过程。
在嵌入式Linux系统中,可以使用FrameBuffer(帧缓冲)来实现图像的显示。
FrameBuffer是一种位图显示设备,可以直接访问和控制显存,并将像素数据显示在屏幕上。
通过FrameBuffer,可以将解码后的像素数据写入显存,并通过控制硬件来在屏幕上显示图像。
三、实现图片解码和显示的步骤要在嵌入式Linux系统中实现图片解码和显示功能,可以按照以下步骤进行:1. 配置嵌入式Linux系统首先,需要在嵌入式Linux系统中配置和编译相应的图像解码库和FrameBuffer驱动。
可以根据具体的硬件平台和系统配置来选择和设置相应的驱动程序和库文件。
2. 加载图像数据将需要解码和显示的图像数据加载到内存中。
可以从文件系统中读取图像数据,或者通过网络或其他外部接口获取图像数据。
在Linux控制台下使用libjpeg显示JPEG图像在framebuffer上1、引言通常情况下,在Linux控制台下是无法查看图像文件的,要想查看图像文件,比如要查看JPEG 格式的图像文件,可能必须启动X-Windows,通过GNOME或者KDE之类的桌面管理器提供的图像查看工具查看图片内容。
那么,能不能有办法在控制台下面简单地浏览图像内容呢。
实际上,这是完全可以的。
在Linux下有一个名为zgv的看图软件就是工作在控制台下的。
不过,由于它所使用的底层图形库svgalib已经是一个比较“古老”的图形库了,所以现在知道zgv的人并不是很多,用的人就更少了。
目前Linux上的底层图形支持通常是由Framebuffer提供的,因此,作者试图在本文中说明如何通过Framebuffer和libjpeg在控制台上显示JPEG图像。
需要说明的是,本文中所编写的程序fv并非zgv的替代品,而只是一个出于验证想法的简单程序(fv的含义是Framebuffer Vision)。
本文将先对Framebuffer和libjpeg的编程做一个简略的说明,然后再给出程序fv 的具体实现。
2、Framebuffer介绍Framebuffer在Linux中是作为设备来实现的,它是对图形硬件的一种抽象[1],代表着显卡中的帧缓冲区(Framebuffer)。
通过Framebuffer设备,上层软件可以通过一个良好定义的软件接口访问图形硬件,而不需要关心底层图形硬件是如何工作的,比如,上层软件不用关心应该如何读写显卡寄存器,也不需要知道显卡中的帧缓冲区从什么地址开始,所有这些工作都由Framebuffer去处理,上层软件只需要集中精力在自己要做的事情上就是了。
Framebuffer的优点在于它是一种低级的通用设备,而且能够跨平台工作,比如Framebuffer 既可以工作在x86平台上,也能工作在PPC平台上,甚至也能工作在m68k和SPARC等平台上,在很多嵌入式设备上Framebuffer也能正常工作。
诸如Minigui之类的GUI软件包也倾向于采用Framebuffer作为硬件抽象层(HAL)。
从用户的角度来看,Framebuffer设备与其它设备并没有什么不同。
Framebuffer设备位于/dev 下,通常设备名为fb*,这里*的取值从0到31。
对于常见的计算机系统而言,32个Framebuffer 设备已经绰绰有余了(至少作者还没有看到过有32个监视器的计算机)。
最常用到的Framebuffer设备是/dev/fb0。
通常,使用Framebuffer的程序通过环境变量FRAMEBUFFER 来取得要使用的Framebuffer设备,环境变量FRAMEBUFFER通常被设置为”/dev/fb0”。
从程序员的角度来看,Framebuffer设备其实就是一个文件而已,可以像对待普通文件那样读写Framebuffer设备文件,可以通过mmap()将其映射到内存中,也可以通过ioctl()读取或者设置其参数,等等。
最常见的用法是将Framebuffer设备通过mmap()映射到内存中,这样可以大大提高IO效率。
要在PC平台上启用Framebuffer,首先必须要内核支持,这通常需要重新编译内核。
另外,还需要修改内核启动参数。
在作者的系统上,为了启用Framebuffer,需要将/boot/grub/menu.lst 中的下面这一行:kernel /boot/vmlinuz-2.4.20-8 ro root=LABEL=/1修改为kernel /boot/vmlinuz-2.4.20-8 ro root=LABEL=/1 vga=0x0314即增加了vga=0x0314这样一个内核启动参数。
这个内核启动参数表示的意思是:Framebuffer 设备的大小是800x600,颜色深度是16bits/像素。
下面,来了解一下如何编程使用Framebuffer设备。
由于对Framebuffer设备的读写应该是不缓冲的,但是标准IO库默认是要进行缓冲的,因此通常不使用标准IO库读写Framebuffer 设备,而是直接通过read()、write()或者mmap()等系统调用来完成与Framebuffer有关的IO 操作。
又由于mmap()能够大大降低IO的开销,因此与Framebuffer设备有关的IO通常都是通过mmap()系统调用来完成的。
mmap()的函数原型如下(Linux系统上的定义):#include <sys/mman.h>#ifdef _POSIX_MAPPED_FILESvoid * mmap(void *start, size_t length, int prot , int flags, int fd,off_t offset);int munmap(void *start, size_t length);#endif系统调用mmap()用来实现内存映射IO。
所谓内存映射IO,是指将一个磁盘文件的内容与内存中的一个空间相映射。
当从这个映射内存空间中取数据时,就相当于从文件中读取相应的字节,而当向此映射内存空间写入数据时,就相当于向磁盘文件中写入数据。
这就是内存映射IO的含义。
具体到对mmap()而言,当调用成功时,返回值就是与磁盘文件建立了映射关系的内存空间的起始地址,当调用失败时,mmap()的返回值是-1。
第一个参数start通常设置为0,表示由系统选择映射内存空间;第二个参数length指定了要映射的字节数;第三个参数指明了映射内存空间的保护属性,对于Framebuffer通常将其设置为PROT_READ | PROT_WRITE,表示既可读也可写;第四个参数flags指明了影响映射内存空间行为的标志,对于Framebuffer 编程而言,要将flags设置为MAP_SHARED,表明当向映射内存空间写入数据时,将数据写入磁盘文件中;第五个参数fd是要映射的文件的文件描述符;第六个参数offset指明了要映射的字节在文件中的偏移量。
如果mmap()调用成功,就可以在程序中对得到的映射内存空间进行读写操作了。
所有的读写都将由操作系统内核转换成IO操作。
在使用完映射内存空间之后,应当将其释放,这是通过munmap()系统调用完成的。
munmap()的第一个参数是映射内存空间的起始地址,第二个参数length是映射内存空间的长度,单位为字节。
如果释放成功,munmap()返回0,否则返回-1。
如果应用程序需要知道Framebuffer设备的相关参数,必须通过ioctl()系统调用来完成。
在头文件<linux/fb.h>中定义了所有的ioctl命令字,不过,最常用的ioctl命令字是下面这两个:FBIOGET_FSCREENINFO和FBIOGET_VSCREENINFO,前者返回与Framebuffer有关的固定的信息,比如图形硬件上实际的帧缓存空间的大小、能否硬件加速等信息;而后者返回的是与Framebuffer有关的可变信息,之所以可变,是因为对同样的图形硬件,可以工作在不同的模式下,简单来讲,一个支持1024x768x24图形模式的硬件通常也能工作在800x600x16的图形模式下,可变的信息就是指Framebuffer的长度、宽度以及颜色深度等信息。
这两个命令字相关的结构体有两个:struct fb_fix_screeninfo和struct fb_var_screeninfo,这两个结构体都比较大,前者用于保存Framebuffer设备的固定信息,后者用于保存Framebuffer设备的可变信息。
在调用ioctl()的时候,要用到这两个结构体。
应用程序中通常要用到struct fb_var_screeninfo的下面这几个字段:xres、yres、bits_per_pixel,分别表示x轴的分辨率、y轴的分辨率以及每像素的颜色深度(颜色深度的单位为bit/pixel),其类型定义都是无符号32位整型数。
3、libjpeg函数库介绍JPEG是CCITT和ISO定义的一种连续色调图像压缩标准[2]。
JPEG是一种有损图像压缩标准,其基础是DCT变换(离散余弦变换)。
JPEG图像的压缩过程分为三步:DCT计算,量化,变长编码分配。
尽管CCITT定义了JPEG图像压缩标准,但是却并没有为JPEG定义标准的文件格式。
这导致了现实世界中出现了各种各样的JPEG文件格式,而一种被称为JFIF 的JPEG文件格式逐渐成为JPEG文件格式的主流。
libjpeg是一个被广泛使用的JPEG压缩/解压缩函数库(至少在Unix类系统下是广泛使用的),它能够读写JFIF格式的JPEG图像文件,通常这类文件是以.jpg或者.jpeg为后缀名的。
通过libjpeg库,应用程序可以每次从JPEG压缩图像中读取一个或多个扫描线(scanline,所谓扫描线,是指由一行像素点构成的一条图像线条),而诸如颜色空间转换、降采样/增采样、颜色量化之类的工作则都由libjpeg去完成了。
要使用libjpeg,需要读者对数字图像的基本知识有初步的了解。
对于libjpeg而言,图像数据是一个二维的像素矩阵。
对于彩色图像,每个像素通常用三个分量表示,即R(Red)、G (Green)、B(Blue)三个分量,每个分量用一个字节表示,因此每个分量的取值范围从0到255;对于灰度图像,每个像素通常用一个分量表示,一个分量同样由一个字节表示,取值范围从0到255。
由于本文不会涉及到索引图像,因此这里略去对索引图像的说明。
在libjpeg中,图像数据是以扫描线的形式存放的。
每一条扫描线由一行像素点构成,像素点沿着扫描线从左到右依次排列。
对于彩色图像,每个分量由三个字节组成,因此这三个字节以R、G、B的顺序构成扫描线上的一个像素点。
一个典型的扫描线形式如下:R,G,B,R,G,B,R,G,B,…通过libjpeg解压出来的图像数据也是以扫描线的形式存放的。
在本文中,只涉及到JPEG的解压缩,因此只对libjpeg的解压过程进行说明,有关libjpeg 的压缩过程和其它高级用法,请参考[3]。
一般地,libjpeg的解压过程如下:1、分配并初始化一个JPEG解压对象(本文中将JPEG解压对象命名为cinfo):struct jpeg_decompress_struct cinfo;struct jpeg_error_mgr jerr;...cinfo.err = jpeg_std_error(&jerr);jpeg_create_decompress(&cinfo);2、指定要解压缩的图像文件:FILE * infile;...if ((infile = fopen(filename, "rb")) == NULL) {fprintf(stderr, "can't open %s\n", filename);exit(1);}jpeg_stdio_src(&cinfo, infile);3、调用jpeg_read_header()获取图像信息:jpeg_read_header(&cinfo, TRUE);4、这是一个可选步骤,用于设置JPEG解压缩对象cinfo的一些参数,本文可忽略;5、调用jpeg_start_decompress()开始解压过程:jpeg_start_decompress(&cinfo);调用jpeg_start_decompress()函数之后,JPEG解压缩对象cinfo中的下面这几个字段将会比较有用:l output_width 这是图像输出的宽度l output_height 这是图像输出的高度l output_components 每个像素的分量数,也即字节数这是因为在调用jpeg_start_decompress()之后往往需要为解压后的扫描线上的所有像素点分配存储空间,这个空间的大小可以通过output_width * output_componets确定,而要读取的扫描线的总数为output_height行。