当前位置:网站首页>Photo album based on gec6818 development board
Photo album based on gec6818 development board
2022-07-27 14:27:00 【amireux512】
One , Implemented function
1. Picture display
2. Up slide , Decline in , Left slide , Slide right to switch pictures
3. Slide show album
4. Display thumbnails of pictures
Two , Code implementation
pic.h
#ifndef __PIC__H_
#define __PIC__H_
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/input.h>
typedef enum DIRECTION{
UP,DOWN,LEFT,RIGHT
}DIRECTION;
typedef struct point{
int x;
int y;
}point;
struct node{
char pics[20];
struct node *next;
};
struct Linked{
struct node *first;
struct node *last;
int nodeNum;
};
int save_color[800][800];
extern void add_node(struct Linked *l,struct node *p);// Add data nodes
extern struct Linked *Create_link(struct Linked *l);// Create a linked list to store the image file name
void show_bmp(int x0,int y0,char * pic,int flag);// display picture
extern void lcd_draw_point(int x,int y,int color);// Draw a dot
extern int get_slip_way();// Get sliding mode
void print_test(struct Linked *l);
void show_mulu(int x0,int y0,struct Linked *l);// Show directory
void lcd_draw_point_mulu(int w,int h,int x,int y,int color);// Draw points in the catalogue
point touch();// Get click events
void control();// Control the operation of the whole program
int touch_bool();// Determine whether to click
void show_left(int i,char *pic);// Slide left to show the next
void show_right(int i,char *pic);// Slide right to display the previous
void show_up(int i,char *pic);// Slide up to show the next
void show_down(int i,char *pic);// The slide shows the previous
void play_pic(struct Linked * l);// Slide show
void show_cril(int i,char *pic);// Draw a circle to show
#endif
main.c
#include "pic.h"
int *plcd = NULL;
/*
lcd_draw_point: Draw a dot
@x: Abscissa
@y: Ordinate
@color: Color
*/
void lcd_draw_point(int x,int y,int color)
{
if(x>=0 && x <800 && y >= 0 && y<480)
{
*(plcd+y*800+x) = color;
}
}
int main()
{
struct Linked *l = Create_link(l);
int lcd_fd = open("/dev/fb0",O_RDWR);
if(lcd_fd == -1)
{
perror("open error\n");
return -1;
}
plcd = mmap(NULL,800*480*4,PROT_READ | PROT_WRITE, MAP_SHARED,lcd_fd,0);
show_bmp(0,0,"mu.bmp",1);
touch();
show_mulu(0, 0,l);
munmap(plcd,800*480*4);
close(lcd_fd);
}
Get the sliding direction , Control picture switching
#include "pic.h"
/*
get_slip_way: Get the sliding direction
*/
int get_slip_way()
{
point p1;
p1.x = -1;
p1.y = -1;
point p2;
p1.x = -1;
p1.y = -1;
int fd = open("/dev/input/event0",O_RDWR);
if(fd == 0)
{
perror("open error\n");
return -1;
}
struct input_event ev;
int ret;
int flag = 0;
int count = 0;
while(1)
{
ret = read(fd,&ev,sizeof(ev));
if(ret != sizeof(ev))
{
close(fd);
perror("read error");
return -1;
}
// Judge the touch event , And get the X value
if(ev.type == EV_ABS && ev.code == ABS_X)
{
if(p1.x < 0)
{
p1.x = ev.value;
}
else
{
p2.x = ev.value;
}
}
if(ev.type == EV_ABS && ev.code == ABS_Y)
{
if(p1.y < 0)
{
p1.y = ev.value;
}
else
{
p2.y = ev.value;
}
}
if(ev.type == EV_KEY && ev.code == BTN_TOUCH && ev.value==0)
{
int dt_x = abs(p1.x - p2.x);
int dt_y = abs(p1.y - p2.y);
if(dt_x > 2*dt_y)
{
if(p1.x > p2.x)
{
return LEFT;
}
if(p1.x < p2.x)
{
return RIGHT;
}
}
else if (2*dt_x < dt_y)
{
if(p1.y > p2.y)
{
return UP;
}
if(p1.y < p2.y)
{
return DOWN;
}
}
else
{
p1.x = -1;
p1.y = -1;
p2.x = -1;
p2.y = -1;
}
}
}
}
/*
control: Control the conversion of pictures
*/
void control()
{
char pic[100] = {0};
int i = 1;
struct Linked *l = Create_link(l);
while(1)
{
DIRECTION x = get_slip_way();
switch (x)
{
case UP:
if(++i >= 14)
{
i = 1;
}
show_cril(i,pic);
show_bmp(0,0,"100.bmp",1);
break;
case LEFT:
if(++i >= 14)
{
i = 1;
}
show_left(i,pic);
show_bmp(0,0,"100.bmp",1);
break;
case DOWN:
if(--i == 0)
{
i = 13;
}
show_down(i,pic);
show_bmp(0,0,"100.bmp",1);
break;
case RIGHT:
if(--i == 0)
{
i = 13;
}
show_right(i,pic);
show_bmp(0,0,"100.bmp",1);
break;
default:
break;
}
point p = touch();
printf("x = %d y = %d\n",p.x,p.y);
if(p.x>=0&&p.x<90&&p.y>=0&&p.y<90)
{
show_mulu(0, 0, l);
show_bmp(360, 0, "play.bmp", 1);
p = touch();
printf("x = %d y = %d\n",p.x,p.y);
if(p.x>360&&p.x<=460&&p.y>=0&&p.y<=90)
{
play_pic(l);
}
}
}
}
Slide show
#include "pic.h"
/*
play_pic: Play pictures
@l: Linked list for storing data
*/
void play_pic(struct Linked *l)
{
struct node *p = l->first;
int flag = 1;// Control different playback modes
char pic[100];
int i = 1;
while(p)
{
if(flag == 1)
{
show_down(i,pic);
flag++;
}else if(flag == 2)
{
show_left(i,pic);
flag++;
}else if(flag == 3)
{
show_up(i,pic);
flag++;
}else if(flag == 4)
{
show_right(i,pic);
flag ++;
}else if(flag == 5)
{
flag = 1;
}
i++;
p = p->next;
}
}
Save the picture to the linked list
#include "pic.h"
/*
add_node: Add data nodes
@l: List to add to
@p: Data nodes to be added
*/
void add_node(struct Linked *l,struct node *p)
{
if(l->first == NULL && l->last == NULL)
{
l->first = p;
l->last = p;
l->nodeNum++;
}
else
{
l->last->next = p;
l->last = p;
l->nodeNum++;
}
}
/*
Create_link: Create a linked list
@l: Initialized linked list
*/
struct Linked *Create_link(struct Linked *l)
{
l = malloc(sizeof(*l));
l->first = NULL;
l->last = NULL;
l->nodeNum = 0;
int i = 1;
while(1)
{
struct node *p = malloc(sizeof(*p));
sprintf(p->pics,"%d.bmp",i);
puts(p->pics);
p->next = NULL;
add_node(l,p);
i++;
if(i == 13)
{
break;
}
}
return l;
}
/*
print_test: Print linked list data
@l: Printed linked list
*/
void print_test(struct Linked *l)
{
struct node *p = l->first;
while(p)
{
puts(p->pics);
p = p->next;
}
}
display picture
#include "pic.h"
/*
show_cril: Circle switch
@i: The name of the picture
@*pic: An empty array is used to store the full file name
*/
void show_cril(int i,char *pic)
{
sprintf(pic,"%d.bmp",i);
puts(pic);
show_bmp(0, 0,pic,0);
int num = 0;
int r = 15;
for(int k=0;k<35;k++)
{
for(int m=0;m<480;m++)
{
for(int n=0;n<800;n++)
{
if((m-240)*(m-240)+(n-400)*(n-400)<=r*r*num)
lcd_draw_point(n, 479-m, save_color[m][n]);
}
}
num = num+30;
}
}
/*
show_left: The picture covers from right to left
@i: The name of the picture
@*pic: An empty array is used to store the full file name
*/
void show_left(int i,char *pic)
{
sprintf(pic,"%d.bmp",i);
puts(pic);
show_bmp(0, 0,pic,0);
for(int m=799;m>=0;m--)
{
for(int n=479;n>=0;n--)
{
lcd_draw_point(m, 479-n, save_color[n][m]);
}
usleep(5);
}
}
/*
show_up: The picture covers from top to bottom
@i: The name of the picture
@*pic: An empty array is used to store the full file name
*/
void show_up(int i,char *pic)
{
sprintf(pic,"%d.bmp",i);
puts(pic);
show_bmp(0, 0,pic,0);
for(int m=0;m<480;m++)
{
for(int n=0;n<800;n++)
{
lcd_draw_point(n, 479-m, save_color[m][n]);
}
usleep(5);
}
}
/*
show_down: The picture covers from bottom to top
@i: The name of the picture
@*pic: An empty array is used to store the full file name
*/
void show_down(int i,char *pic)
{
sprintf(pic,"%d.bmp",i);
puts(pic);
show_bmp(0, 0,pic,0);
for(int m=479;m>=0;m--)
{
for(int n=0;n<800;n++)
{
lcd_draw_point(n, 479-m, save_color[m][n]);
}
usleep(5);
}
}
/*
show_right: Picture from left to cover
@i: The name of the picture
@*pic: An empty array is used to store the full file name
*/
void show_right(int i,char *pic)
{
sprintf(pic,"%d.bmp",i);
show_bmp(0, 0,pic,0);
for(int m=0;m<800;m++)
{
for(int n=0;n<480;n++)
{
lcd_draw_point(m, 479-n, save_color[n][m]);
}
usleep(5);
}
}
/*
show_bmp: display picture
@x0: Initial abscissa
@y0: Initial ordinate
@*pic: Image file name
@flag: by 0 Save pixels , by 1 Show immediately
*/
void show_bmp(int x0,int y0,char * pic,int flag)
{
int fd = open(pic,O_RDWR);
int hight,width;
short depth;
unsigned char buf[4] = {0};
lseek(fd,0x0A,SEEK_SET);
read(fd, buf,4);
int save = buf[3] <<24 | buf[2] <<16 | buf[1]<<8 |buf[0] <<0;
lseek(fd,0x12,SEEK_SET);
read(fd, buf,4);
width = buf[3] <<24 | buf[2] <<16 | buf[1]<<8 |buf[0] <<0;
lseek(fd,0x16,SEEK_SET);
read(fd, buf,4);
hight = buf[3] <<24 | buf[2] <<16 | buf[1]<<8 |buf[0] <<0;
lseek(fd,0x1c,SEEK_SET);
read(fd, buf,2);
depth = buf[1] <<8 | buf[0];
int laizi = 0;
if((width/8) % 4 != 0)
{
laizi = 4 - (width/8)%4;
}
int real_width = laizi + abs(width);
int total_by = real_width *abs(hight) *(depth/8);
unsigned char* pixel = malloc(total_by);
lseek(fd,54,SEEK_SET);
read(fd,pixel,total_by);
int m ,n,i = 0;
unsigned int a,r,g,b;
int color;
printf("hight= %d, width = & %d\n",hight,width);
for(m = 0;m<abs(hight);m++)
{
for(n=0;n<abs(width);n++)
{
b = pixel[i++];
g = pixel[i++];
r = pixel[i++];
if(depth == 24)
{
a = 0;
}
else if (depth == 32 )
{
a = pixel[i++];
}
color = a<<24 | r <<16 | g<<8 | b;
save_color[m][n] = color;
if(flag==1)
{
lcd_draw_point( width>0 ? x0+n : x0+abs(width)-n-1,hight>0? y0+hight-m-1 : y0+m,color);
}
}
i = i +laizi;
usleep(50);
}
free(pixel);
close(fd);
}
/*
show_bmp_small: Show directory thumbnails
@x0: Initial abscissa
@y0: Initial ordinate
@*pic: Image file name
*/
void show_bmp_small(double x0,double y0,char * pic)
{
int fd = open(pic,O_RDWR);
int hight,width;
short depth;
unsigned char buf[4] = {0};
lseek(fd,0x0A,SEEK_SET);
read(fd, buf,4);
int save = buf[3] <<24 | buf[2] <<16 | buf[1]<<8 |buf[0] <<0;
lseek(fd,0x12,SEEK_SET);
read(fd, buf,4);
width = buf[3] <<24 | buf[2] <<16 | buf[1]<<8 |buf[0] <<0;
lseek(fd,0x16,SEEK_SET);
read(fd, buf,4);
hight = buf[3] <<24 | buf[2] <<16 | buf[1]<<8 |buf[0] <<0;
lseek(fd,0x1c,SEEK_SET);
read(fd, buf,2);
depth = buf[1] <<8 | buf[0];
int laizi = 0;
if((width/8) % 4 != 0)
{
laizi = 4 - (width/8)%4;
}
int real_width = laizi + abs(width);
int total_by = real_width *abs(hight) *(depth/8);
unsigned char* pixel = malloc(total_by);
lseek(fd,54,SEEK_SET);
read(fd,pixel,total_by);
int m ,n,i = 0;
unsigned int a,r,g,b;
int color;
for(m = 0;m<abs(hight);m=m+1)
{
for(n=0;n<abs(width);n=n+1)
{
b = pixel[i++];
g = pixel[i++];
r = pixel[i++];
if(depth == 24)
{
a = 0;
}
else if (depth == 32 )
{
a = pixel[i++];
}
color = a<<24 | r <<16 | g<<8 | b;
lcd_draw_point( width>0 ? (x0+n)/4.0 : (x0+abs(width)-n-1)/4.0,hight>0? (y0+hight-m-1)/3.0 : (y0+m)/3.0,color);
}
i = i +laizi;
}
free(pixel);
close(fd);
}
/*
show_mulu: display picture
@x0: Initial abscissa
@y0: Initial ordinate
@l : Save the linked list of image file names
*/
void show_mulu(int x0,int y0,struct Linked *l)
{
struct node *p = l->first;
int w=0;
int h=0;
int flag = -1;
while(p)
{
show_bmp_small(w*4, h*3, p->pics);
w = w + 200;
usleep(5);
if(w==800)
{
w = 0;
h = h +160;
}
p = p->next;
}
show_bmp(360, 0, "play.bmp", 1);
point p1 = touch();
printf("x = %d y = %d\n",p1.x,p1.y);
if(p1.x>360&&p1.x<=440&&p1.y>=0&&p1.y<=90)
{
play_pic(l);
}
if(p1.x>=0&&p1.x<200 && p1.y>=0&&p1.y<=160)
{
flag = 1;
}
if(p1.x>=200&&p1.x<400&& p1.y>=0&&p1.y<=160)
{
flag = 2;
}
if(p1.x>=400&&p1.x<600 && p1.y>=0&&p1.y<=160)
{
flag = 3;
}
if(p1.x>=600&&p1.x<800 && p1.y>=0&&p1.y<=160)
{
flag = 4;
}
if(p1.x>=0&&p1.x<200 && p1.y>=160&&p1.y<=320)
{
flag = 5;
}
if(p1.x>=200&&p1.x<400&& p1.y>=160&&p1.y<=320)
{
flag = 6;
}
if(p1.x>=400&&p1.x<600 && p1.y>=160&&p1.y<=320)
{
flag = 7;
}
if(p1.x>=600&&p1.x<800 && p1.y>=160&&p1.y<=320)
{
flag = 8;
}
if(p1.x>=0&&p1.x<200 && p1.y>=320&&p1.y<=480)
{
flag = 9;
}
if(p1.x>=200&&p1.x<400&& p1.y>=320&&p1.y<=480)
{
flag = 10;
}
if(p1.x>=400&&p1.x<600 && p1.y>=320&&p1.y<=480)
{
flag = 11;
}
if(p1.x>=600&&p1.x<800 && p1.y>=320&&p1.y<=480)
{
flag = 12;
}
char pic[32] = {0};
sprintf(pic,"%d.bmp",flag);
show_bmp(0,0,pic,1);
show_bmp(0,0,"100.bmp",1);
control();
}
Touch screen judgment
#include "pic.h"
/*
touch: Get click events
@retval: The coordinates of the click
*/
point touch()
{
point p;
p.x = -1;
p.y = -1;
int fd = open("/dev/input/event0",O_RDWR);
if(fd == 0)
{
perror("open error\n");
return p;
}
struct input_event ev;
int ret;
while(1)
{
ret = read(fd,&ev,sizeof(ev));
if(ret != sizeof(ev))
{
close(fd);
perror("read error");
return p;
}
// Judge the touch event , And get the X value
if(ev.type == EV_ABS && ev.code == ABS_X)
{
if(p.x < 0)
{
p.x = ev.value*(800.0/1024);//EV_ABS Default 1024,600
}
}
if(ev.type == EV_ABS && ev.code == ABS_Y)
{
if(p.y < 0)
{
p.y = ev.value*(480.0/600);
}
}
if(p.x>=0&&p.y>=0)
{
close(fd);
return p;
}
}
}
/*
touch_bool: Determine whether to click
*/
int touch_bool()
{
point p;
p.x = -1;
p.y = -1;
int fd = open("/dev/input/event0",O_RDWR);
if(fd == 0)
{
perror("open error");
return 0;
}
struct input_event ev;
int ret;
int flag = -1;
while(1)
{
ret = read(fd,&ev,sizeof(ev));
if(ret != sizeof(ev))
{
close(fd);
perror("read error");
return 0;
}
if(ev.type == EV_ABS && ev.code == ABS_X)
{
return 1;
}
if(ev.type == EV_ABS && ev.code == ABS_Y);
{
return 1;
}
if(p.x>=0 && p.y>=0)
{
return 0;
}
}
}
边栏推荐
- The difference between [x for X in list_a if not np.isnan (x)] and [x if not np.isnan (x) else none for X in list_a]
- 机场云商sign解析
- SLAM综述阅读笔记六:基于图像语义的SLAM调研:移动机器人自主导航面向应用的解决方案 2020
- PROFINET simulator tutorial
- 汉字风格迁移篇---对抗性区分域适应(L1)Adversarial Discriminative Domain Adaptation
- Getting started for beginners: build your own blog with WordPress
- 进程间通信
- 力扣SQL语句习题,错题记录
- NFT 的 10 种实际用途
- Flexible and easy to use WYSIWYG visual report
猜你喜欢
![[intensive reading of papers] grounded language image pre training (glip)](/img/3a/4ad136065acb8627df9e064ed8ef32.png)
[intensive reading of papers] grounded language image pre training (glip)

RTL8762DK 环境搭建(一)

基于RoBERTa-wwm动态融合模型的中文电子病历命名实体识别

Cultural tourism and data collection | travel to Yunnan in an artistic way

Windows10 installing SQL Server 2019

Ten thousand words detailed Google play online application standard package format AAB

【多线程的相关内容】

uniapp的request数据请求简单封装步骤

West test Shenzhen Stock Exchange listing: annual revenue of 240million, fund-raising of 900million, market value of 4.7 billion

Alibaba's latest equity exposure: Softbank holds 23.9% and caichongxin holds 1.4%
随机推荐
开源版思源怎么私有部署
Electronic bidding procurement mall system: optimize traditional procurement business and speed up enterprise digital upgrading
架构——MVC的升华
Lesson 3: reverse word order
STM32——电容触摸按键实验
连接ResourceManager 失败
Getting started for beginners: build your own blog with WordPress
Airport cloud business sign analysis
Flat die cutting machine
Pure C handwriting thread pool
Detoxify! After Harbin Institute of technology was disabled MATLAB, domestic industrial software fought back domineering
Lighting 5g in the lighthouse factory, Ningde era is the first to explore the way made in China
基于GEC6818开发板的相册
Navicate reports an error access violation at address 00000000
融合迁移学习与文本增强的中文成语隐喻知识识别与关联研究
CARLA 笔记(04)— Client 和 World (创建 Client、连接 World 、批处理对象、设置 Weather、设置 Lights、World snapshots)
Slam overview Reading Note 6: slam research based on image semantics: application-oriented solutions for autonomous navigation of mobile robots 2020
Redis
Is the security of online brokerage app account opening guaranteed?
LeetCode·每日一题·592.分数加减运算·模拟