基于Linux+6818开发板实现普通电子相册翻页功能
更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。
首先是外部进程传参,传进的是某目录文件的路径(绝对路径/相对路径)。接着打开目录文件,遍历目录内所有的文件,将后缀名为“.bmp”的普通文件全部找出来,并拼接保存它们的路径到双向循环链表里,一个节点存放一个bmp图片的路径。再通过触摸屏返回的坐标值进行逻辑判断,例如返回坐标值 < 400,触摸了左边的显示屏,我们应该让双向循环链表的当前节点 p 指向 p->prev节点,最后输出显示。
后续更新:
加上音频、视频后:基于ARM的LCD(800*480)触摸屏实现音频、视频播放、图像显示功能
加入百叶窗基本效果:LCD显示屏加入百叶窗特效显示BMP图片
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <errno.h>
#include <dirent.h>int tsfd ;//触摸屏驱动
int dst; //显示屏驱动//显示任意位置任意大小的BMP图片
bool showbmp(char *bmppath)
{int w = 0;int h = 0;int src = open(bmppath , O_RDWR);if(src == -1){printf("到头了!\n");}lseek(src, 18 ,SEEK_SET); //获取BMP图片的宽w信息read(src, &w, 4);lseek(src, 22 ,SEEK_SET); //获取BMP图片的高h信息read(src, &h, 4);char bmpbuf[w*h*3];int lcdbuf[w*h];int tempbuf[w*h];dst = open("/dev/fb0",O_RDWR); //打开显示屏驱动if(dst == -1){printf("显示屏打开失败!\n");return -1;}lseek(src, 54, SEEK_SET); //跳过BMP图片头信息字节int rubbish = (4-(w*3)%4)%4; //BMP图片字节不能被4整除时,加入的垃圾字节数for(int i = 0; i < h; i++){read(src, &bmpbuf[w*i*3],w*3);lseek(src, rubbish, SEEK_CUR); //在字节读入时,跳过垃圾字节}for(int i = 0; i < w*h; i++) //将RGB转换成BGR{lcdbuf[i] = 0x00<<24 | bmpbuf[i*3+2]<<16 | bmpbuf[i*3+1]<<8 | bmpbuf[i*3];}for(int i = 0; i < w; i++){for(int j = 0; j < h; j++){tempbuf[(h-1-j)*w+i] = lcdbuf[j*w+i]; //BMP像素点上下反转}}//内存映射int *mmap_bmp = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, dst, 0);for(int i = 0; i < h; i++){for(int j = 0; j < w; j++){// 自定义y偏移量 自定义x偏移量*(mmap_bmp+800*(((480-h)/2)+i)+((800-w)/2)+j) = tempbuf[i*w+j];}}//解除内存映射munmap(mmap_bmp, 800*480*4);close(src);close(dst);
} //打开触摸屏
int touch_open()
{ tsfd=open("/dev/input/event0",O_RDWR); //打开触摸屏驱动if(tsfd==-1){perror("打开触摸屏失败!\n");return -1;}return 0;}int get_xy(int *x, int *y) //获取触摸屏的坐标值
{struct input_event myevent;int count = 0;while(1){read(tsfd,&myevent,sizeof(myevent));if(myevent.type==EV_ABS) //说明触发的是触摸屏事件{if(myevent.code==ABS_X) //x坐标{*x = (myevent.value*800)/1024;count ++;}if(myevent.code==ABS_Y) //y坐标{*y = (myevent.value*480)/600;count ++;}}if(count == 2)break;}
} //关闭触摸屏
int touch_close()
{close(tsfd);return 0;
}//设置节点
struct node
{char *data;struct node *next;struct node *prev;
};//初始化链表
struct node *list_init()
{struct node *head = malloc(sizeof(struct node));head->next = head;head->prev = head;return head;
}//创建新节点
struct node *newnode(char *newdata)
{struct node *new = malloc(sizeof(struct node));new->data = newdata;new->next = NULL;new->prev = NULL;
}//加入新节点
int addnode(struct node *new,struct node *list)
{struct node *p = list;while(p->next != list){p = p->next;}new->prev = list->prev;new->next = list;list->prev = new;new->prev->next = new;
}int main(int argc,char **argv)
{struct node *list = list_init();//初始化双向循环链表DIR *dp = opendir(argv[1]); //打开目录文件argv[1]struct dirent *p;while(p = readdir(dp)) //遍历目录文件{if(p->d_type == DT_REG){if(strstr(p->d_name,".bmp")) //判断是否为.bmp文件{struct node *new = newnode(p->d_name); //创建新节点addnode(new,list); //插入新节点} }}char buf[20];struct node *head = list->next;int tx = 0,ty = 0;touch_open();//打开触摸屏while(1){ get_xy(&tx, &ty);//获取触摸屏的坐标if(ty > 190 && ty < 290){if(tx > 700 && tx < 800) //右翻{//printf("你点击的坐标位置X坐标是:%d\n", tx);//printf("你点击的坐标位置Y坐标是:%d\n", ty);head = head->next;bzero(buf,20);sprintf(buf,"%s/%s",argv[1],head->data);}if(tx < 100 && tx > 0) //左翻{//printf("你点击的坐标位置X坐标是:%d\n", tx);//printf("你点击的坐标位置Y坐标是:%d\n", ty);head = head->prev;bzero(buf,20);sprintf(buf,"%s/%s",argv[1],head->data);}showbmp("background.bmp");//开发板下,可执行文件目录下存放的背景图(可以使用绝对路径!)showbmp(buf); //显示BMP图片} if(tx > 700 && ty < 100){showbmp("background.bmp");break;}}//关闭触摸屏touch_close();
}
我的background图:
基于Linux+6818开发板实现普通电子相册翻页功能相关推荐
- 迅为4418/6818开发板实现最小Linux系统自动挂载SD/TF卡/U盘等存储设备
本文转自迅为论坛:http://www.topeetboard.com 在论坛里找到的,先做个笔记以后用到随时看 通过 mdev 工具实现 U 盘和 SD/TF 卡的自动挂载步骤如下: 一.配置内核 ...
- 利用粤嵌LinuxGEC6818开发板实现电子相册
实验目的 利用粤嵌LinuxGEC6818开发板实现电子相册,要求如下: 实验操作必须在Linux操作系统下完成 源代码模块化设计 实现水平或者垂直滑动切换图片 实验步骤 因为操作需要在Linux下运 ...
- 【Verilog】基于Nexys4DDR开发板实现数字钟
功能: 基于Nexys4DDR开发板实现的数字钟,六位数码管显示时分秒,可切换24时制/12时制,有整点报时功能(led灯闪烁). Verilog代码: `timescale 1ns / 1ps//数 ...
- 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程
基于PYNQ-Z2开发板实现矩阵乘法加速 主要内容 1.在Vivado HLS中生成矩阵乘法加速的IP核. 2.在Vivado中完成Block Design. 3.在Jupyter Notebook上 ...
- Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯
Mixly(米思齐)的安装以及基于Arduino开发板实现电容触摸控制灯 1.Mixly下载 http://mixly.org/bnu-maker/mixly-arduino-win Mixly软件安 ...
- 基于STM32开发板实现传感数据采集-DHT11温湿度采集
基于STM32开发板实现传感数据采集-DHT11温湿度采集 一.项目简介 本次项目是基于STM32开发板实现传感数据采集-DHT11温湿度采集.采用ARM结构中最为代表的Cortex-M4系列的芯片, ...
- STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集
STM32开发板实现传感数据采集-DHT11温湿度采集 一.前言 本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等.本项目采用ARM结构中最为代表的Co ...
- 基于RK3588开发板实现多屏拼接
基于RK3588开发板实现多屏拼接 多屏拼接功能说明 将一组完整的画面分割为若干子画面分别送给不同的屏幕显示,可以支持下图的多种模式 硬件环境 基于RK3588 EVB开发板实现4屏拼接,RK3588 ...
- RT3070无线网卡AP模式——开发板实现路由功能
RT3070无线网卡有两种工作模式STA模式和softAP模式,分别由STA驱动和softAP驱动来实现,STA驱动支持无线网卡工作在STA模式下,可以连接到网络实现上网功能.而SoftAP的驱动支持 ...
最新文章
- 堆栈——Windows核心编程学习手札之十八
- 更换Winform 皮肤(上)----使用现有皮肤
- 小程序: 在同一个文件夹中配置多个页面
- 苹果屏幕一半失灵一半好的_佛说:一半一半(写的真好!)
- Visual Studio配置64/32位汇编程序开发环境
- 大学大专mysql考试试卷_MySQL数据库基础应用-中国大学mooc-试题题目及答案
- 王一博、张艺兴等多位明星起诉医美平台更美App
- Fragment+ViewPager+ButterKnife时控件会报空指针问题
- .Net程序猿玩转Android开发---(8)表格布局TableLayout
- mall架构及功能概览
- ubuntu:磁盘清理
- 多标签分类问题中的评价指标:准确率,交叉熵代价函数
- (struct)结构体变量作为函数参数调用的方法小结
- Google的搜索结果真的没有人为参与吗?
- apk开发教程!了解Android架构组件后,构建APP超简单!先收藏了
- DAE系统的设计-豆瓣首席架构师洪强宁
- php微擎Goto2C解密研究
- html文件访问遭拒,防止IE中出现“ SCRIPT5:访问被拒绝”错误
- win7系统32位和64位的区别是什么32位和64位哪一个更好
- 【CV】图像卷积计算即二维矩阵卷积(Python)
热门文章
- 利用公交刷卡数据分析北京职住关系和通勤出行
- 【element-ui】
- 使用python uiautomation从钉钉网页版提取公司所有联系人信息
- DC-DC PCB layout 指导
- ubuntu安装Linux集成服务,Hyper-v R2中安装ubuntu后,安装集成环境。--梦飞翔的地方(梦翔天空)...
- 什么是拓扑(Topology) - 3D 角色 建模过程中的 中的术语:拓扑
- 中山大学 精品课程C++ 视频教学
- 博学谷在线python教育_2020年最新 博学谷Python基础班(共9天)
- 异或运算与奇偶校验的作用
- 断舍离的难处-less is more