荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示jpg图片

2024-03-22 13:50

本文主要是介绍荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示jpg图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、jpeglib 库移植
    • 1、jpeglib 库下载
    • 2、安装 jpeglib 库
  • 二、jpeg 图片解压缩过程和压缩过程
    • 1、jpeg 解压缩过程
    • 2、jpeg 压缩过程
  • 三、编译 C 源码
    • 1、源码展示
    • 2、拷贝需要用到的头文件
    • 3、编译 C 代码
  • 四、验证测试
    • 1、拷贝相关文件到开发板
    • 2、显示图片
  • 五、资源自取
    • 方式1:github 链接
    • 方式2:百度网盘


前言

由于从上篇博文 “荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示bmp图片” 中只实现了显示 bmp 图片,实际上我们很常用到的图片多数是 jpg 格式图片,因此我们需要折腾一下,实现 jpg 文件的显示。


一、jpeglib 库移植

1、jpeglib 库下载

下载网址:http://www.ijg.org/files
在这里插入图片描述
这里我选择最新的一个版本,即 jpegsrc.v9e.tar.gz 这个 jpeglib 库

2、安装 jpeglib 库

源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)。
<1>、创建安装目录
在 Linux PC 机上新建一个文件夹,用于存放安装文件,并将 jpegsrc.v9e.tar.gz 拷贝到当前目录下:

mkdir /home/Gnep/licheepi_zero/tools
cd tools/
cp /home/share/jpegsrc.v9e.tar.gz ./
ls

在这里插入图片描述
<2>、解压 jpegsrc.v9e.tar.gz 到安装目录

tar -xf jpegsrc.v9e.tar.gz
ls

在这里插入图片描述
<3>、配置
进入其目录,执行:

cd jpeg-9e/
./configure --prefix=/home/Gnep/licheepi_zero/tools CC=arm-linux-gnueabihf-gcc --host=arm-linux --enable-shared --enable-static
  • 其中 --prefix 选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在 /usr/local/bin,库文件默认放在 /usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr/local/share,比较凌乱。
    用 --prefix 选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。
  • 其中 CC 选项是用来选择你想使用的 C 编译器的绝对路径
  • 其中 --host 选项指需要运行的位置,默认为 build,也就是本机编译出来的程序,由本机使用;当本机编译出来的程序要在 arm 板子上运行时,就要设置为 arm-linux
  • --enable-shared:生成动态链接库
  • --enable-static:生成静态链接库

在这里插入图片描述
<4>、编译

make

在这里插入图片描述
<5>、安装

make install

在这里插入图片描述
tools 目录下的文件为现在如下:
在这里插入图片描述
后面我们需要将 lib 目录下的 libjpeg.so.9 和 libjpeg.so.9.5.0 拷贝到开发板的 /usr/lib 目录中,将 include 目录下的头文件拷贝到我们需要编译的 C 代码的目录下
在这里插入图片描述
在这里插入图片描述
以上 jpeglib 库移植完成。

二、jpeg 图片解压缩过程和压缩过程

jpeg/jpg 格式图片显示,经过有损压缩的图片文件格式,文件较小,获取颜色数据需要解压

1、jpeg 解压缩过程

  • 打开设备文件和图片文件
    • int lcd_fd = open(“/dev/fb0”, O_RDWR);
    • FILE *infile = fopen(argv[1], “r+”);
  • 为jpeg对象分配空间并初始化
    • jpeg_create_decompress(&cinfo);
  • 指定解压缩数据源
    • jpeg_stdio_src(&cinfo, infile);
  • 为解压缩设定参数,包括图像大小,颜色空间
    • cinfo.scale_num = 1; //分子
    • cinfo.scale_denom = n; //分母
  • 开始解压缩
    • jpeg_start_decompress(&cinfo);
  • 取出数据(做相关的应用)
    • jpeg_read_scanlines(&cinfo, (JSAMPARRAY)&buffer, 1);
    • 将每行数据显示到LCD
  • 解压缩完毕
    • jpeg_finish_decompress(&cinfo);
  • 释放资源
    • jpeg_destroy_decompress(&cinfo);
    • munmap(p, lcd_wlcd_hlcd_b);
    • close(lcd_fd);
    • fclose(infile);
    • free(buffer);

2、jpeg 压缩过程

  • 为jpeg对象分配空间并初始化
  • 指定图像输出目标
  • 为压缩设定参数,包括图像大小,颜色空间
  • 开始压缩
  • 写入数据(做相关的应用)
  • 压缩完毕
  • 释放资源

三、编译 C 源码

1、源码展示

imageshow.c

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <stdbool.h>
#include "jpeglib.h"
int main(int argc, char const *argv[])
{if (argc != 2){printf("./可执行文件 <jpeg格式图片文件>\n");return -1;}//打开液晶屏int lcd_fd = open("/dev/fb0", O_RDWR);if (lcd_fd == -1){perror("open");return -1;}//获取液晶屏信息struct fb_var_screeninfo vinfo;ioctl(lcd_fd, FBIOGET_VSCREENINFO, &vinfo); // 获取可变属性int lcd_w = vinfo.xres;int lcd_h = vinfo.yres;int lcd_b = vinfo.bits_per_pixel/8;printf("该液晶屏宽:%d,高:%d, 每个像素点%d个字节\n", lcd_w, lcd_h, lcd_b);//进行内存映射int *p = mmap(NULL, lcd_w * lcd_h * lcd_b, PROT_WRITE | PROT_READ, MAP_SHARED, lcd_fd, 0);if (p == (void *)-1){perror("mmap");return -2;}// 刷黑屏幕memset(p, 0x00, 800 * 480 * 4); //(1)为jpeg对象分配空间并初始化struct jpeg_decompress_struct cinfo;	//解压jpeg的对象结构体struct jpeg_error_mgr jerr;				//定义错误结构体cinfo.err = jpeg_std_error(&jerr);		//错误处理结构体绑定jpeg_create_decompress(&cinfo);			//初始化jpeg的对象结构体//(2)指定解压缩数据源FILE *infile = fopen(argv[1], "r+");if (infile == NULL){perror("fopen jpeg");return -3;}jpeg_stdio_src(&cinfo, infile);//指定解压缩数据源//(3)获取文件信息jpeg_read_header(&cinfo, true);//(4)为解压缩设定参数,包括图像大小,颜色空间int n = 1;			//缩小倍数while(cinfo.image_width/n>lcd_w || cinfo.image_height/n>lcd_h){n *= 2;}//设定的缩小倍数cinfo.scale_num = 1;		//分子cinfo.scale_denom = n;		//分母// cinfo.out_color_space = JCS_GRAYSCALE;	//颜色空间printf("width1:%d height1:%d\n", cinfo.image_width, cinfo.image_height);//设定之前的宽高//(5)开始解压缩jpeg_start_decompress(&cinfo);printf("width:%d height:%d\n", cinfo.output_width, cinfo.output_height);//设定解压缩之后的宽高//(6)取出数据(做相关的应用),安装一行一行去读取的//output_components像素点大小//申请能够存放一行数据的缓冲区int row_size = cinfo.output_width*cinfo.output_components;char *buffer = (char *)malloc(row_size);//output_scanline当前读取行数while(cinfo.output_scanline < cinfo.output_height){//按行读取数据jpeg_read_scanlines(&cinfo, (JSAMPARRAY)&buffer, 1);//将读取到的一行数据进行显示int i = 0, j = 0;for (;j< cinfo.output_width; i+=3, j++){//内存映射的方式*(p+(cinfo.output_scanline-1)*lcd_w + j) = buffer[i+0]<<16| buffer[i+1]<<8| buffer[i+2];}}//(7)解压缩完毕jpeg_finish_decompress(&cinfo);//(8)释放资源jpeg_destroy_decompress(&cinfo);munmap(p, lcd_w*lcd_h*lcd_b);close(lcd_fd);fclose(infile);free(buffer);return 0;
}

2、拷贝需要用到的头文件

C 代码中包含了 jpeglib.h 头文件(#include “jpeglib.h”),因此我们需要拷贝库安装目录下的四个头文件(jconfig.h jerror.h jmorecfg.h jpeglib.h,路径:/home/Gnep/licheepi_zero/tools/include/),到自己应用程序的目录下。

cp /home/Gnep/licheepi_zero/tools/include/* ./

在这里插入图片描述

3、编译 C 代码

编译应用程序时,要增加动态库的链接-ljpeg 选项

arm-linux-gnueabihf-gcc imageshow.c -o imageshow -L /home/Gnep/licheepi_zero/tools/lib/ -ljpeg

在这里插入图片描述

四、验证测试

1、拷贝相关文件到开发板

①、将 imageshow、libjpeg.so.9、libjpeg.so.9.5.0拷贝到 tftpboot 目录中

cp imageshow /tftpboot/
cp /home/Gnep/licheepi_zero/tools/lib/*.so.* /tftpboot/

在这里插入图片描述
②、将 imageshow 、777.jpg、888.jpeg 拷贝到开发板上,将库安装目录下的 lib 目录下的 libjpeg.so.9 和 libjpeg.so.9.5.0 拷贝到开发板的 /usr/lib 目录中

tftp -g -l 777.jpg 192.168.25.25
tftp -g -l 888.jpeg 192.168.25.25
tftp -g -l imageshow 192.168.25.25
tftp -g -l libjpeg.so.9 192.168.25.25
tftp -g -l libjpeg.so.9.5.0 192.168.25.25
cp libjpeg.so.9 /usr/lib
cp libjpeg.so.9.5.0 /usr/lib

在这里插入图片描述

2、显示图片

①、雪山照(800 * 480)

./imageshow 777.jpg 

在这里插入图片描述
在这里插入图片描述
②、风景照(480* 272)

./imageshow 888.jpeg

在这里插入图片描述
在这里插入图片描述

五、资源自取

方式1:github 链接

https://github.com/Gnepuil79/licheepi.git

方式2:百度网盘

链接:https://pan.baidu.com/s/1GWuML5BpRJZ0MneXq9u2Gw
提取码:td2e


我的qq:2442391036,欢迎交流!


这篇关于荔枝派Zero(全志V3S)驱动开发之RGB LCD屏幕显示jpg图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/835410

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧