【Liux下6818开发板(ARM)】实现简易相册

这篇具有很好参考价值的文章主要介绍了【Liux下6818开发板(ARM)】实现简易相册。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

【Liux下6818开发板(ARM)】实现简易相册,6818开发板实战(ARM),linux,服务器,6818

 一、基本流程

        这个程序实现了一个实现简易的相册,使用6818开发板的液晶屏和触摸屏,可以显示多张BMP格式的图片,并支持通过触摸屏的操作切换图片。

        程序的主要功能和流程如下:

  1. 打开液晶屏设备文件,并将液晶屏映射到内存:通过打开/dev/fb0设备文件,并使用mmap函数将液晶屏映射到内存,以便后续在屏幕上显示图片。

  2. 打开触摸屏设备文件:通过打开/dev/input/event0设备文件,实现对触摸屏输入事件的捕获和处理。

  3. 获取图片路径名字:通过get_bmpname函数获取指定目录下的所有BMP格式图片的路径名字,并存储在数组bmppath中。

  4. 显示第一张图片:程序默认显示第一张图片,使用show_bmp函数将图片显示在液晶屏上。

  5. 循环监听触摸事件:进入无限循环,程序不断监听触摸屏的输入事件。根据触摸坐标判断用户点击了屏幕的哪个区域。

  6. 切换图片:根据触摸坐标的位置,如果用户点击了右上角区域,则切换到上一张图片;如果点击了右下角区域,则切换到下一张图片。通过更新bmppath数组的索引 来实现图片的切换,并调用show_bmp函数将新的图片显示在液晶屏上。

二、函数实现

        主函数代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <dirent.h>
#include <bmp.h>

#define LCDDEV		"/dev/fb0"	

#define PATH_SIZE		1024
#define PHOTO_SIZE		100

#define TOUCH_DEV "/dev/input/event0" // 触摸屏设备文件路径


void get_xy(int touch_fd,int *x,int *y)
{

    struct input_event buf;
    *x = -1;
	*y = -1;

    while (1)
    {
        // 读取触摸事件
		int ret = read(touch_fd, &buf, sizeof(buf));
        if (ret == -1){
			perror("read fail");
			exit(errno);
		}
        // 判断事件类型是否是触摸事件
        if (buf.type == EV_ABS)
        {
            // 根据事件类型设置对应的坐标值
            if (buf.code == ABS_X){
                *x = (buf.value * 800) / 1024;
			}	
            if (buf.code == ABS_Y){
                *y = (buf.value * 800) / 1024;
			}
        }

        if (!(*x > 0 && *x < 800 && *y > 0 && *y < 480)){
			continue;
		}	
		
		if(*x>-1 && *y>-1){
			break; // 得到坐标后退出
		}	
    }
	
}

// 从目录中读取BMP类型图片路径名字
void get_bmpname(char *dir, char *bmppath[])
{
	char *cur_path = calloc(PATH_SIZE, sizeof(char));	//程序执行的位置
	char *dst_path = calloc(PATH_SIZE, sizeof(char));	//指定要读取文件的路径
	if(  !(cur_path && dst_path) )
	{
		perror("calloc fail");
		exit(errno);
	}
	
	// 保留程序执行的位置
	getcwd(cur_path, PATH_SIZE);
	
	// 获取指定目录的绝对路径
	chdir(dir);
	getcwd(dst_path, PATH_SIZE);
	
	
	// 1.打开目录文件
	DIR *dp = opendir(dir);
	if ( dp == NULL )
	{
		perror("opendir fail");
		exit(errno);
	}
	
	// 2. 读取目录项
	int i = 0;
	struct dirent *ep = NULL;
	while(1)
	{
		ep = readdir(dp);
		if ( ep == NULL && errno == 0 )	//成功读完所有的目录项
		{
			break;
		}		
		else if( ep == NULL )	//进入到这个判断,说明errno值已被改变,出现某种错误
		{
			perror("readdir fail");
		}
		
		if ( strstr(ep->d_name, ".bmp") )
		{
			if(bmppath[i] == NULL)
				bmppath[i] = calloc(PATH_SIZE, sizeof(char));
			else
				bzero(bmppath[i], PATH_SIZE);
			
			snprintf(bmppath[i], PATH_SIZE, "%s/%s", dst_path, ep->d_name);
			i++;
		}
		else
		{
			continue;
		}
	}
	
	// 继续向后检索,是否为NULL,不为空这次读取的图片资源没有上次多
	// 应该把多余申请的资源释放掉
	for(; bmppath[i] != NULL; i++)
	{
		free(bmppath[i]);
		bmppath[i] = NULL;
	}
	
	// 关闭目录
	closedir(dp);
}

int main(int argc, char *argv[])
{
	int x,y;
	
	// 打开液晶屏设备
	int lcd_fd = open(LCDDEV, O_RDWR);
	if(lcd_fd == -1)
	{
		perror("open lcd fail");
		exit(errno);
	}
	
	// 给液晶屏文件映射一块内存
	int *fb = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
	if(fb == MAP_FAILED)
	{
		perror("mmap fail");
		exit(errno);
	}
	
	// 打开触摸屏
    int touch_fd = open(TOUCH_DEV, O_RDONLY);
    if (touch_fd < 0){
        perror("打开触摸屏失败");
        exit(errno);
    }
	
	// 获取指定目录的图片路径名字
	char *bmppath[PHOTO_SIZE] = {NULL};
	
	int i = 0;
	
	
	get_bmpname("./", bmppath);
	for (i=0; bmppath[i] != NULL; i++)	//获取读到多少张图片路径
		/* empty */;
	//默认显示第一张图片	
	show_bmp(bmppath[0], fb, 0, 0);
	
	while(1) 
	{	
		get_xy(touch_fd, &x, &y);
		if(x>400 && x<800 && y>0 && y<240){		//右上角的那块区域
			{
				--i; 
				if (i < 0){
					i = 5;
				}	
				show_bmp(bmppath[i], fb, 0, 0);
				
			}
		}	
		else if(x>400 && x<800 && y>240 && y<480){	//右下角的那块区域
				++i;
				if (i > 5) {
					i = 0; // 如果i小于0,跳转至6
				}
				show_bmp(bmppath[i], fb, 0, 0);
				
		}
		
	}				
			

	
	// 关闭触摸屏
	close(touch_fd);
	// 关闭液晶屏
	munmap(fb, 800*480*4);
	close(lcd_fd);
	
    return 0;
}

        全部的文件打包放这了。

模拟相册https://download.csdn.net/download/qq_64928278/88136955?spm=1001.2014.3001.5501

        更多C语言Linux系统相关文章,关注专栏:

   手撕C语言

            玩转linux文章来源地址https://www.toymoban.com/news/detail-621984.html

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

到了这里,关于【Liux下6818开发板(ARM)】实现简易相册的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于GEC6818开发板的相册

    1.图片的显示 2.上滑,下滑,左滑,右滑切换图片 3.幻灯片播放相册 4.显示图片的缩略图 pic.h main.c 获取滑动方向,控制图片切换 幻灯片播放 保存图片到链表 显示图片 触屏判断

    2024年02月12日
    浏览(33)
  • 【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片

    (꒪ꇴ꒪ ),hello我是 祐言 博客主页:C语言基础,Linux基础,软件配置领域博主🌍 快上🚘,一起学习! 送给读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏         在嵌入式系统的开发中,我们经常需要在液晶

    2024年02月08日
    浏览(30)
  • 基于粤嵌gec6818开发板嵌入式开发电子相册,音乐播放,视频播放,2048游戏

    实现功能:本系统需要使用粤嵌的GEC-6818开发板设计一款娱乐影音系统,其中包括图片显示(相册)、音乐播放、视频播放,游戏四个部分,在每个部分内部,具有操控各个部分的功能触摸按键。本系统还应具有蓝牙远程操控功能。 具体要求:对使用者具有良好的可视交互体

    2024年02月13日
    浏览(52)
  • 学习笔记(1)——粤嵌gec6818实现电子相册,音乐播放器,视频播放器。

    (1)设计一个初始界面,并且设置电子相册,音乐播放器,视频播放器三个触摸按键。 (2)电子相册——能够实现相册的幻灯片功能,实现相册左右滑动切换相片。 (3)音乐播放器实现——切歌,播放和暂停功能。 (4)视频播放器实现——播放、暂停、音量大小、快进倒

    2024年02月11日
    浏览(45)
  • 粤嵌 GEC-6818 蓝牙智能家庭影音 arm开发记录

    注意:未经允许不得转载,引用请注明出处 文件操作:创建、删除、复制、移动 环境:VMware15.5,ubantu16.04,串口驱动HI-340,secureCRT 设置共享文件夹,设置后ubantu系统和windows系统可以共享使用该文件夹里面的内容。 1.gcc编译:将c文件进行编译 2.交叉编译:将c文件编译成arm文

    2024年01月22日
    浏览(57)
  • 微信小程序开发实战:实现图片保存到手机相册的方法

    随着微信小程序的普及,越来越多的人开始使用微信小程序来实现各种功能。其中,将图片保存到手机相册是一个常见的需求,但是如何实现呢?本文将介绍如何使用微信小程序实现将图片保存到手机相册,帮助大家快速掌握这一实用技能。 首先,在 data 中定义了两个变量,

    2024年02月13日
    浏览(34)
  • GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音

    体积小,使用到数据结构里面的 霍夫曼树(哈夫曼树) 对数据进行压缩 1.对jpegsrc.v8c.tar.gz进行arm移植 移植方式如下: 1.将jpegsrc.v8c.tar.gz解压缩到ubuntu ~ 2.进入~/jpeg-8c对jpeg库进行配置 3.编译 4.安装,将动态库存放到 /home/gec/armJPegLib 5.清空编译记录 6.自己查看下 /home/gec/armJPegLib目

    2024年01月17日
    浏览(44)
  • ARM裸机开发——简易嵌入式游戏开发

    利用LCD屏,实现简易的图片展示,展示个人信息 利用图片显示与按键功能实现简易的游戏设计,需要包含动画连贯展示   本实验主要为具体游戏设计,主要包含游戏架构设计、底层硬件设计、具体代码实现四部分,设计了本项目方案的架构图如图2.1所示。 图2.1 游戏设计整

    2024年02月06日
    浏览(47)
  • flutter开发实战-图片保存到相册

    flutter开发实战-图片保存到相册。保存相册使用的是image_gallery_saver插件 在pubspec.yaml中引入插件 使用image_gallery_saver将图片保存到相册 flutter开发实战-图片保存到相册。保存相册使用的是image_gallery_saver插件。 学习记录,每天不停进步。

    2024年02月15日
    浏览(53)
  • OpenHarmony开发实战:电子相册(ArkTS)

    本篇Codelab介绍了如何实现一个简单的电子相册应用的开发,主要功能包括: 实现首页顶部的轮播效果。 实现页面跳转时共享元素的转场动画效果。 实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 Swiper:滑块视图容器,提供子组件滑动轮播显示的

    2024年04月28日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包