一、要显示JPEG 图片就必须要把jpeg个解码成bmp,那么我们就需要用到官方的jpeg解码库:

http://www.ijg.org/ 下载地址

1.移植jpeg源码变成arm版本的解码库

把源码拷贝到家目录,因为共享目录不支持链接文件!!
cp jpegsrc.v8a.tar.gz /home/honghai
解压源码
tar -xvf jpegsrc.v8a.tar.gz

2.交叉编译jpeg源码

新建文件夹libjpeg用来装库
//进入到源码目录:cd jpeg-8a
//配置编译脚本
./configure --host=arm-linux --target=arm-linux --prefix=/home/honghai/libjpeg CC=arm-linux-gcc
//参数说明:
–host 运行的平台
–target 目标文件的平台
–prefix 生成的库文件路径
CC= 编译工具的名称

3.编译工具的名称

make

4.安装

make install

5. 把编译生成的库移植到开发板中:

libjpeg.so
libjpeg.so.8
libjpeg.so.8.0.1
下载到开发板的lib目录

编译命令:

arm-linux-gcc jpeg_show.c -o jpeg_show -I/home/gec/jpeg_arm_lib/include -L/home/gec/jpeg_arm_lib/lib -ljpeg(arm-linux-gcc c文件 -o 目标文件 -ljpeg)

二、配置freetype字库需要freetyp文件压缩包(和jpeg步骤一致)

1.移植freetype源码变成arm版本的解码库

把源码拷贝到家目录,因为共享目录不支持链接文件!!

cp freetype-2.4.10.tar.bz2 /home/honghai

解压源码

tar -xvf freetype-2.4.10.tar.bz2

2.交叉编译jpeg源码

新建文件夹libjpeg用来装库
//进入到源码目录:cd freetype-2.4.10/
//配置编译脚本

./configure --host=arm-linux --target=arm-linux --prefix=/home/honghai/libfreetype CC=arm-linux-gcc

//参数说明:
–host 运行的平台
–target 目标文件的平台
–prefix 生成的库文件路径
CC= 编译工具的名称

3.安装

make install

4. 把编译生成的库移植到开发板中:

把libfreetype/lib压缩打包都开发板根目录
a.下载lib_zi.tar.bz 到开发板的根目录 /

cd /
tar -xjvf lib_zi.tar.bz

b.下载 宋体GKB码 字体集到根目录 /
simsun.ttc
下载到开发板的lib目录

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include "kernel_list.h"
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/input.h> //输入模型的定义
#include "lcd_app.h"int *lcd=NULL;//定义大结构体
struct  big_list
{char name[1024];struct list_head list;
};//把头结点定义为全局变量
struct list_head  *head=NULL;//插入新节点
void   my_inser(char *picname)
{       //指向头节点struct list_head *h=head;struct  big_list   *new = ( struct  big_list*)malloc(sizeof( struct  big_list));//new->name = picname;strcpy(new->name,picname);  //把路径赋值到数据域//插入新节点list_add_tail(&new->list,h);}//判断文件后缀
void get_type(char *path,char *dirpath)
{//判断传递过来的图片格式什么格式char name[1024]={0};        sprintf(name,"%s/%s",dirpath,path);int len = strlen(name);  //判断.jpgif(name[len-1] == 'g' && \name[len-2] == 'p' && \name[len-3] == 'j' && \name[len-4] == '.' ){// printf("path=%s\n",name);  my_inser(name); //插入数据到链表中}//判断.bmpif(name[len-1] == 'p' && \name[len-2] == 'm' && \name[len-3] == 'b' && \name[len-4] == '.' ){// printf("path=%s\n",name);my_inser(name);                 }}//显示24位 bmp图片
int showbmp(const char *pic)
{//打开图片文件int bmpfd = open(pic,O_RDWR);if(bmpfd < 0){perror("");return -1;}//读取图片的头信息unsigned char head[54]={0};read(bmpfd,head,54);//解析宽高  int  kuan = *((int *)&head[18]);int  gao  = *((int *)&head[22]);printf("kuan = %d\n",kuan);printf("gao  = %d\n",gao);//变长数组int buf[gao][kuan];//32位图的bufchar tmp_buf[gao*kuan*3]; //24位图的buf//读取文件的数据到 buf中  read(bmpfd,tmp_buf,sizeof(tmp_buf));unsigned char r=0;unsigned char g=0;unsigned char b=0;unsigned char a=0;unsigned char *p = tmp_buf;unsigned int color = 0;unsigned int x=0,y=0;for(y=0;y<gao;y++)for(x=0;x<kuan;x++){b = *p++;g = *p++;r = *p++;a = 0;color  = a << 24 | r << 16 | g << 8 | b;buf[y][x] = color;//保存颜色值//把图片的像素点赋值到lcd设备中//边界判断int tmpy = gao-1-y;if(tmpy < 480 && x < 800) //越界了{*(lcd+tmpy*800+x) = buf[y][x];  //显示颜色值}}//关闭所有设备close(bmpfd);}       int slide()
{//打开触摸屏设备int tsfd = open("/dev/input/event0",O_RDWR);if(tsfd < 0){perror("");return -1;}int x=0,xx=0,y=0,yy=0;//读取触摸屏的事件值struct input_event ts; //定义输入系统模型while(1){read(tsfd,&ts,sizeof(ts));//处理信息if(ts.type == EV_ABS && ts.code == ABS_X){//输出X轴的坐标值x = ts.value;}if(ts.type == EV_ABS && ts.code == ABS_Y){//输出X轴的坐标值y = ts.value;}//获取Y轴的坐标点if(ts.type == EV_KEY  && ts.code == BTN_TOUCH && ts.value == 1){//输出X轴的坐标值xx = x;yy = y;printf("xx=%d,yy=%d\n",xx,yy);}if(ts.type == EV_KEY && ts.code == BTN_TOUCH && ts.value == 0){//输出X轴的坐标值printf("x=%d,y=%d\n",x,y);printf("xx-x=%d,yy-y=%d\n",xx-x,yy-y);//消除抖动if(xx-x < -20){return 1;printf("右\n");}if(xx - x > 20){return 2;printf("左\n");}//把上下 也判断出来if(yy-y < -20){return 3;printf("下\n");}if(yy-y > 20){return 4;printf("上\n");}//清空数据x  = 0;y  = 0;xx = 0;yy = 0;  printf("****************************************\n");}}
}//遍历链表显示数据
void show_date(int *lcd_p)
{//3.遍历链表输出数据struct list_head  *pos  = head;int num=0;while(1){num = slide();switch(num){case 1:{//取数据  tmp 保存大结构体的首地址pos=pos->next;struct big_list  *tmp  =  list_entry(pos,struct big_list,list);printf("tmp->date = %s\n",tmp->name);//判断图片格式int len = strlen(tmp->name);  //判断.jpgif(tmp->name[len-1] == 'g' && \tmp->name[len-2] == 'p' && \tmp->name[len-3] == 'j' && \tmp->name[len-4] == '.' ){// printf("path=%s\n",name);  read_JPEG_file(tmp->name);}//判断.bmpif(tmp->name[len-1] == 'p' && \tmp->name[len-2] == 'm' && \tmp->name[len-3] == 'b' && \tmp->name[len-4] == '.' ){// printf("path=%s\n",name);showbmp(tmp->name);}//显示单个汉子unsigned char c='A';//lcd_put_ascii(lcd_p,100,100,c);//wchar_t *wtext  宽字符wchar_t *p = L"我想你";Lcd_Show_FreeType(lcd_p,p,64,0x00ff00,1,0,100,200);wchar_t *p0 = L"我好饿";Lcd_Show_FreeType(lcd_p,p0,64,0x00ff00,0,0,100,300);break;}case 2:{//取数据  tmp 保存大结构体的首地址pos=pos->prev;struct big_list  *tmp  =  list_entry(pos,struct big_list,list);printf("tmp->date = %s\n",tmp->name);//判断图片格式int len = strlen(tmp->name);  //判断.jpgif(tmp->name[len-1] == 'g' && \tmp->name[len-2] == 'p' && \tmp->name[len-3] == 'j' && \tmp->name[len-4] == '.' ){// printf("path=%s\n",name);  read_JPEG_file(tmp->name);}//判断.bmpif(tmp->name[len-1] == 'p' && \tmp->name[len-2] == 'm' && \tmp->name[len-3] == 'b' && \tmp->name[len-4] == '.' ){// printf("path=%s\n",name);showbmp(tmp->name);}break;}case 3:{//取数据  tmp 保存大结构体的首地址pos=pos->prev;struct big_list  *tmp  =  list_entry(pos,struct big_list,list);printf("tmp->date = %s\n",tmp->name);//判断图片格式int len = strlen(tmp->name);  //判断.jpgif(tmp->name[len-1] == 'g' && \tmp->name[len-2] == 'p' && \tmp->name[len-3] == 'j' && \tmp->name[len-4] == '.' ){// printf("path=%s\n",name);  read_JPEG_file(tmp->name);}//判断.bmpif(tmp->name[len-1] == 'p' && \tmp->name[len-2] == 'm' && \tmp->name[len-3] == 'b' && \tmp->name[len-4] == '.' ){// printf("path=%s\n",name);showbmp(tmp->name);}break;}case 4:{//取数据  tmp 保存大结构体的首地址pos=pos->prev;struct big_list  *tmp  =  list_entry(pos,struct big_list,list);printf("tmp->date = %s\n",tmp->name);//判断图片格式int len = strlen(tmp->name);  //判断.jpgif(tmp->name[len-1] == 'g' && \tmp->name[len-2] == 'p' && \tmp->name[len-3] == 'j' && \tmp->name[len-4] == '.' ){// printf("path=%s\n",name);  read_JPEG_file(tmp->name);}//判断.bmpif(tmp->name[len-1] == 'p' && \tmp->name[len-2] == 'm' && \tmp->name[len-3] == 'b' && \tmp->name[len-4] == '.' ){// printf("path=%s\n",name);showbmp(tmp->name);}break;}}}
}//读取目录函数
int read_dir(char *dirpath)
{//读取目录DIR *fd=opendir(dirpath);if(fd == NULL){perror("opendir fail\n");return -1;}//开始遍历目录while(1){//读取目录struct dirent *p=readdir(fd);if(p == NULL){break;}//跳过隐藏文件  if(p->d_name[0] == '.'){continue;}//判断文件夹的类型if(p->d_type == DT_DIR)  //目录{//再次调用读取目录函数//路径名的拼接  char  newpath[1024]={0};sprintf(newpath,"%s/%s",dirpath,p->d_name);read_dir(newpath);  }if(p->d_type == DT_REG) //普通文件{//输出目录的名字//printf("path=%s\n",p->d_name);//处理bmp与jpg图片get_type(p->d_name,dirpath);}}//关闭已经打开的目录closedir(fd);}int main(int argc,char *argv[])
{//判断用户输入的参数是否正确if(argc != 2){printf("请输入需要遍历的目录./main xxx\n");return -1;}get_lcd_info();     //打开LCD设备int  fd = open("/dev/fb0",O_RDWR);      if(fd < 0){printf("open lcd fail\n");}//对LCD设备进行映射操作lcd = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);head  = (struct list_head*)malloc(sizeof(struct list_head));//初始化头节点INIT_LIST_HEAD(head);   //初始化头结点//调用遍历目录函数read_dir(argv[1]);//显示链表中的数据show_date(lcd);close(fd);munmap(lcd,800*480*4);
}

开发板移植jpeg图片库与freetype字库相关推荐

  1. 乐鑫Esp32学习之旅 23 安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  2. [2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植

    文章目录 一.前言 二.准备所用到的环境以及版本信息 1.Ubuntu和内核版本 2.gcc和g++版本 3.交叉编译gcc和g++版本 4.开发板信息 三.开发环境编译&安装qrencode ...

  3. arm开发板移植 curl

    arm开发板移植 curl 一,下载curl源码 二,配置curl 三,移植到arm平台上 三,arm平台curl测试 一,下载curl源码 地址:https://curl.haxx.se/downl ...

  4. RK3399-NanoPC-T4-Android10开发板移植AAOS

    基于RK3399-NanoPC-T4-Android10开发板移植AAOS工作.碰到的问题,调试思路,和修改记录整理如下. 方案一,把目前RK3399-T4开发板对应的驱动(喇叭,相机,蓝牙,LCD等 ...

  5. 野火iMX6ULL Pro开发板移植SDL2

    承诺的Linux三部曲移植还没写完,差个根文件系统没有写呢,但实在压抑不住内心的亢奋情绪,先把SDL2移植奉献给大家吧.关于SDL的移植,已经进行一个月了,之前把SDL移植成功后打算写Python的模 ...

  6. LVGL的PC端移植和STM32F429阿波罗开发板移植

    LVGL 8.1_学习总结 LVGL介绍 LVGL开发环境 LVGL的GitHub的代码介绍 LVGL8.1 在F429上面的移植 准备 修改lv_port_disp.c文件中的 修改lv_port_ ...

  7. imx6ull 开发板移植mjpg-streamer

    imx6ull 移植mjpg-streamer 参考链接:https://blog.csdn.net/mucheni/article/details/109447610 前期准备: PC端:Ubunt ...

  8. 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2

    Part0 准备知识 0.1 关键参数说明 0.1.1 开发板说明 OK6410是飞凌公司发布的一款开发板,当前有2个版本,OK6410-A和OK6410-B,我当前使用的是前者:前者也经历过升级,所 ...

  9. jz2440开发板移植U-boot之修改代码支持DM9000网卡

    今天我们来移植U-boot到jz2440开发板,修改代码支持DM9000网卡.查看之前写的移植记录请点击链接:点击查看之前的移植记录 现在大多数开发板都支持DM9000网卡.我们的U-boot源码里面 ...

最新文章

  1. python and or 与 | 的比较
  2. React之渲染元素
  3. java怎么看具体被挂起的线程_Java线程的挂起、恢复和终止
  4. PHP 依赖镜像出问题后,阿里工程师的一顿“神操作“令人叫绝!
  5. Software_King-jdk配置java
  6. PC和服务器的IP地址信息DNS,PC和服务器的IP地址信息DNS
  7. 快速检查REST API是否有效的方法-从清单文件中获取详细信息
  8. 1023:坑爹的黑店
  9. 已知3个坐标点xy画圆弧_尺规作图之过一点作已知直线的垂线
  10. jQuery学习(十二)—jQuery中对象的查找方法总结
  11. jquery 甘特图开发指南
  12. centos 时间服务器ntp
  13. IDEA ideaIU点击无反应
  14. oracle 简版客户端instantclient使用 oledb ODAC组件使用
  15. project甘特图导出图片_Project2013教程-常见视图-甘特图
  16. 电机驱动详解--从原理到智能车驱动(DRV8701)
  17. WebOffice安装教程Hello World!(win10 IE打开控件问题)
  18. python判断是否回文_Python语言判断输入的是否是回文数的方法
  19. 75---Python绘制动态狄拉克delta函数
  20. 特斯拉神器TeslaMate一键安装,终于来了

热门文章

  1. 【蓝桥软件学院】泛型类、泛型方法及泛型应用
  2. BUUCTF-MISC-另外一个世界
  3. 潍坊科技学院五专部计算机应用基础试题,计算机应用基础考试试题B
  4. Android集成百度钱包
  5. html多个倒计时,倒计时(支持多个).html
  6. WanAndroid
  7. Vue快速入门(含下载地址)
  8. 为数不多的小爱好 ——书法—— 分享日常写字(2020-12)
  9. gazebo 直接获取传感器数据_Gazebo软件简介
  10. 在VS2013环境下MFC学习:给对话框添加背景图片