zigbee无线传感网实训---在LCD屏上显示JPG图片、 触摸屏、相册(The fourth day)

b

承接实训第三天:zigbee无线传感网实训---LCD显示bmp图片及一些简单的c语言编程功能( On the third day)

一、修改实训第三天中练习2中的bug(在原码的基础上增加:lseek(bmp, 54, SEEK_SET);即可)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main(int argc, char **argv)
{
	int lcd = open("/dev/fb0", O_RDWR);

	if(lcd == -1)
	{
		perror("打开LCD失败");	
		exit(0);
	}

	// 2, 映射一块恰当大小的内存
	char *p = mmap(NULL, // 不指定映射内存的位置,让系统自动选取
		       800*480*4, // 映射内存的大小
		       PROT_READ | PROT_WRITE, // 以读、写模式操作映射内存
		       MAP_SHARED, // 其他线程、进程可以共享访问这块内存
		       lcd, // LCD文件描述符
		       0    // 映射内存与LCD的偏移量,0代表完全重合
		       );

	// 3, 准备数据
	if(argc < 2)
	{
		printf("参数不对!\n");
		close(lcd);
		munmap(p, 800*480*4);
		exit(0);
	}
	int bmp =  open(argv[1], O_RDONLY);
	if(bmp == -1)
	{
		perror("打开图片失败!");
		close(lcd);
		munmap(p, 800*480*4);
		exit(0);	
	}
	char bmp_buf[800*480*3];
	
	lseek(bmp, 54, SEEK_SET);//bug修复处
	int ret = read(bmp, bmp_buf, sizeof(bmp_buf));
	if(ret <= 0)
	{
		perror("读取bmp数据失败!");
		close(lcd);
		close(bmp);
		munmap(p, 800*480*4);
		exit(0);
	}
	int lcd_buf[800*480];
	// 4, 铺满整个映射内存
	for(int i=0; i<800*480; i++)
	{
		lcd_buf[i]=bmp_buf[i*3] | bmp_buf[i*3+1]<<8 | bmp_buf[i*3+2]<<16;
	}

	for(int y=0; y<480; y++)
	{
		for(int x=0; x<800; x++)
		{
			memcpy(p+4*x+800*4*y, &lcd_buf[x+(479-y)*800], 4);
		}
	}

	// 5, 释放资源
	munmap(p, 800*480*4);
	close(lcd);

	return 0;	
}

编译过程同实训第二天。

效果图:

二、常见的图片格式:
        bmp  jpg jpeg bng ....
        除了bmp位图其他格式的图片全都是进过特定的图像压缩算法压缩过的若要在开发板显示其他格式的图片需要移植解码库     jpg及jpeg解码库移植
        复制 jpegsrc.v9c.tar.gz到ubuntu的家目录

cp jpegsrc.v9c.tar.gz ~/

 解压   

  cd ~
  mkdir jpeg
  tar zxvf jpegsrc.v9c.tar.gz -C ./jpeg

 编译:
            切换路径到/home/gec/jpeg/jpeg-9c/             

 cd jpeg/jpeg-9c/

 配置:

./configure --prefix=/home/gec/jpeg/ --host=arm-none-linux-gnueabi

prefix//指定安装路径     host//指定编译器
            编译:

make

安装:

make install

 切换路径到/home/gec/jpeg
        查看是否安装成功:
                    bin  include  lib  share(存在这些内容则表示安装成功)
        压缩库文件“lib”                

tar zcvf jpeglib.tar.gz lib

  拷贝到共享文件夹              

cp jpeglib.tar.gz /mnt/hgfs/**   //**表示自己创建的文件夹名

   -----------------------------------------------------------

在LCD开发板中
        将压缩包传输到开发板          

 tftp -g 192.168.1.** -r jpeglib.tar.gz  //192.168.1.**表示本机IP

  解压到你开发板的家目录下         

 cd ~
 mkdir jpeg
 tar zxvf jpeglib.tar.gz -C ~/jpeg

   -------------------------------------------------------------
        编译显示jpg图片代码             

 arm-none-linux-gnueabi-gcc show_jpg.c -o show_jpg -I/home/gec/jpeg/include -L/home/gec/jpeg/lib -ljpeg

            -I  --->指定头文件的路径
            -L  --->指明库文件所在路径
            -l  --->指定要连接的库名
            动态库的命名libxxxx.so.**** ---> xxxx表示库的名字
            
        将可执行程序下载到开发板      

tftp -g 192.168.1.181 -r show_jpg
chomd 777 show_jpg  //修改权限
tftp -g 192.168.1.181 -r 1.jpg  
./show_jpg 1.jpg 


        出错:
            ./show_jpg: error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory
        在环境变量中指定库文件的路径         

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/chongjiao/lib

            ”/chongjiao/lib“ 下载到开发板的lib的路径
            一次的
            想要永久保留将export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:“/chongjiao/lib”
            写入/etc/profile即可
            vi /etc/profile 
            写到最后一句export ***的下一行即可
 练习:

在LCD屏上显示JPG图片:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <syslog.h>
#include <errno.h>
#include <linux/input.h>

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <std
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuxiaodong1312

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值