精华内容
下载资源
问答
  • 本科毕业论文(设计) 题目 基于Linux电子相册的 设计与实现 学院 数学与计算机科学学院 班级 2010级计算机本科一班 基于Linux电子相册的设计与实现 摘要随着科技的不断进步我们的学习和生活也在发生着日新月异的变化...
  • 基于嵌入式 ARM-Linux电子相册设计方案电子相册市场成长的必然性( 1)市场需求的必然性在上世纪末本世纪初, 电子相册呈现迅速发展的势头, 普及型数码相机的 分辨率由 200万象素增长到现在的 800— 1500 万象素,...

    基于嵌入式 ARM-Linux 的电子相册设计方案

    电子相册市场成长的必然性

    ( 1)市场需求的必然性

    在上世纪末本世纪初, 电子相册呈现迅速发展的势头, 普及型数码相机的 分辨率由 200万象素增长到现在的 800— 1500 万象素,价格也由 300美元左右下 降到现在的 120美元左右。随着数码相机的日益普及,作为一种以数字照片的 保存、回放和浏览为核心功能的产品——电子相册自然迎合了消费者的需求。

    ( 2) 核心器件性能和价格的合理化推动市场的发展

    电子相册有三大核心器件:处理器,半导体存储器和LCDS示单元。随着

    ARM勺不断发展,电子相册所需要的 ARM+Jpe处理器技术已为许多厂商所拥有, 集成了 USB Host及卡接口单元的产品也屡见不鲜。Nandflash技术飞速发展,

    单位容量的价格在过去的六年中约下跌 40至50倍。

    电子相册未来产品的发展

    数码相框

    数码相框将是以数字照片的重显为主要功能的产品, 其功能更接近于传统 意义上的相框。 由于受到人机界面的限制, 为更方便地重显和浏览以及确定重 显的规则,这类产品不强调有大容量的存以及丰富的卡接口。主要特征是: ( 1)USB 接口以便更新和同步数据;

    (2)在某些情况下(如从 PC端通过相框的US肢口同步数据时),允许修改数 字照片的格式,使其有最佳的重显效果;

    ( 3)仅依靠置的半导体存储器存放需要重显的数字照片;

    ( 4)文件(照片)查询和播放规则设定非常简洁易用;

    ( 5)产品大致分为桌面和壁挂两种。

    电子相册

    跟PC相同的类似功能,这类产品的主要特征是:

    ( 1)有大容量的置数据存储器;

    ( 2) USB 等各种卡接口,并支持部存贮器与各种数据存贮器之间的同步以及 相互拷贝;

    ( 3)强大的文件管理功能:浏览,搜寻,命名(重命名),复制,删除,备 份等;

    ( 4 )带或不带建显示单元,有能支持其它高分辨率显示设备的接口(如色差, 'VGA甚至是HDM);与其他产品的功能结合的产品形态以及大头贴等产品,用 于不在本文所包含的围。

    1.3 目前市场上流行三种系统设计架构

    单芯片解决方案

    以单芯片的解决方案,以ESS/AMLOGIC/MPXI芯片设计为代表, PHILIP/Sony 等品牌厂商也以该方式为主。

    该方案的优点:

    ( 1)结构简单,成本低,芯片功能强大;

    ( 2)多媒体的编解码速度快。 该方案的缺点:

    ( 1)可扩展的余地不足; (2)对读卡部分,某些方案使用硬件实现,不能支持新类型的卡;

    ( 3)应客户要求的二次开发比较不方便。

    以DSP+FPGA?硬件为基础,用软件算法实现功能

    这种方案,是以DSP来实现多媒体部分的编解码算法,再由FPGAK现显示

    输出格式的算法转化;读卡部分,文件系统部分由DSP软件处理,外围设备大

    的驱动由DSP的软件算法实现。

    这种方案的优点: 功能扩展升级性强,软件实现读卡部分,新的类型卡,外围设备可以通过 升级方式实现。

    这种方案的缺点:

    ( 1)整体成本比较大;

    (2) 客户二次开发难度大。DSP和FPGA勺算法实现需要专业人员;

    (3)显示输出由FPGAS现,该类输出大部分是数字的输出,模拟输出支持比 较弱。

    ARM9 核心方案

    以ARM等强大的CPI为核心,以WINCE LINUX等操作系统为软件核心架构系统。此方案以 ARM 口 S3C2410 In tel xscale 等强大的嵌入式 CPU为架构,速 度在200M-300MHZ嵌入WINCE LINUX等操作系统,实现多媒体的编解码。 该方案的优点:

    (1)系统芯片功能强大,实现的功能多,对于新的多媒体格式支持好,只需 要安装更新的软件;

    ( 2)硬件电路简单;

    ( 3)二次开发容易实现。

    该方案的缺点:

    (1)成本较大,该类强大的 CPU-般使用在PDA等嵌入式领域;

    ( 2)比较耗电,使用软件解码功耗与频率相关性很大。

    2 硬件设计方案

    本设计选用的是第三种方案:以ARM9CPU_S3C24为核心,以Linux操作系

    统为软件核心架构。

    基于ARM勺微处理器具有低功耗、低成本、高性能等特点,ARM采用RISC

    (精简指令集计算机)架构和流水线结构,使用了大量的寄存器,具有极高的 工作效率。其中,RISC架构具有如下特点:固定长度的指令格式,指令归整、 简单,基本寻址方式只有 2~3种,使用单周期指令,便于流水线操作。

    ARM微处理器按性能分为以下系列:ARM7 ARM9 ARM9EARM10E SecureCore

    Xscale。ARMS持两种类型的指令集:一种是32位的ARM旨令,以字对准保存;

    另一种是16位的Thumb旨令,半字对准保存。

    ARW有7种工作状态:

    USR正常的程序执行状态

    FIQ :用于高速数据传输或

    展开全文
  • 基于linux电子相册

    2020-03-02 22:02:33
    这个项目使用arm开发板,运用了linux系统的文件读取,写入、arm的LED屏幕的图片显示和触摸屏控制等功能。 ...当开发板突然断电后,重启开发板运行电子相册程序后依然能展示上次浏览到的图片位置。
  • Linux音乐电子相册(相册部分)

    千次阅读 2015-03-02 19:18:27
    Linux下的电子音乐相册
    //编译后的程序需与图片放置于同一文件夹,开始、退出界面图片在上一级目录,具体路径请自行配置
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/mman.h>  //mmap();   munmap();
    #include <linux/input.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <signal.h>  //SIGCHLD变量头文件
    #include <pthread.h>
    
    #define HEIGHT 480  //屏幕分辨率
    #define LENGTH 800
    
    #define DAEMON 120
    
    #define PICDIR "/usr/lcd/gal"  //图片路径
    #define PICNUM 9  //BMP图片数目
    #define THNUM 4  //线程数
    #define BEGIN "../pic0.bmp"  //开始界面图片路径
    #define END "../pic9.bmp" //退出界面图片路径
    
    #define LCD "/dev/fb0"  //LCD设备路径
    #define KEY "/dev/event1"  //键盘设备路径
    
    #define UPS SIGRTMIN+1  //上一张
    #define DOWNS SIGRTMIN+2  //下一张
    #define BEGINS SIGRTMIN+3  //开始
    #define QUITS SIGRTMIN+4  //退出
    #define RETURN SIGRTMIN+4  //返回
    
    #define ESC 1  //各个按键的键值
    #define HOME 2
    #define POWER 3
    #define ENTER 96
    #define UP 103
    #define DOWN 108
    #define LEFT 105
    #define RIGHT 106
    
    struct input_event key_value;
    
    int isEnter = 0;  //标记是否打开程序
    int isOpen = 0;  //标记是否打开图片
    int pageSum = 0;  //标记总页数
    int page = 1;  //标记当前页号,从1开始
    int choice = 0;  //标记选中哪一张图片(0-1-2-3)
    
    FILE* bmp[PICNUM];
    FILE* bmpEND;
    FILE* bmpBEG;
    int* fb_mem;
    char buff[LENGTH * HEIGHT * 3];
    
    pid_t pptpid;
    int pptfd[2];
    
    void DrawLCD(FILE* bmps, int x1, int x2, int y1, int y2, int z1, int z2) {  //按给定参数绘制图片
    	/* x1:x起始位置;  x2:x结束位置;  y1:y起始位置;  y2:y结束位置;  z1:行偏移位置;  z2:列偏移位置
    	 * 函数作用:从(x1, y1)到(x2, y2)绘制图片bmps
    	 * 横向每(z1 + 1)个像素并为一个,纵向每(z2 + 1)行并为一行, z1、z2需配合x1、x2、y1和y2 */
    	int x = 0;
    	int y = 0; 
    	int i = 0;
    	fseek(bmps, 54, SEEK_SET);
    	fread(buff, LENGTH * HEIGHT * 3, 1, bmps);	
    	for (y = y2; y >= y1; y--) {
    		for (x = x1; x <= x2; x++) {
    			*(fb_mem + y * LENGTH + x) = (buff[i] << 0 | buff[i + 1] << 8 | buff[i + 2] << 16);
    			i += 3 * (z1 + 1);
    		}
    		i += z2 * (3 * LENGTH);
    	}
    }
    
    void toPage() {  //按页号将四张图片输出为一张
    	if (((page - 1) * 4) > PICNUM || page <= 0) {  //超出图库范围则报错
    		perror("Page Out Of Range\n");
    		return;
    	} else {
    		//Read((0,0)~(399,239))
    		DrawLCD(bmp[4 * (page - 1)], 0, LENGTH / 2 - 1, 0, HEIGHT / 2 - 1, 1, 1);  //(0, 0) -> (LENGTH / 2 - 1, HEIGHT / 2 - 1), 偏移像素1,偏移行数1
    		
    		//Read((400,239)~(799,239))
    		if ((4 * (page - 1) + 1) < PICNUM) {
    			DrawLCD(bmp[4 * (page - 1) + 1], LENGTH / 2, LENGTH - 1, 0, HEIGHT / 2 - 1, 1, 1);  //(LENGTH / 2, 0) -> (LENGTH - 1, HEIGHT / 2 - 1), 偏移像素1,偏移行数1
    		} else {
    			int x = 0;
    			int y = 0;
    			for (y = (HEIGHT / 2 - 1); y >= 0; y--) {
    				for (x = LENGTH / 2; x < LENGTH; x++) {
    					*(fb_mem + y * LENGTH + x) = 0xb5b5b5;
    				}
    			}
    		}
    		//Read((0,240)~(399,479))
    		if ((4 * (page - 1) + 2) < PICNUM) {
    			DrawLCD(bmp[4 * (page - 1) + 2], 0, LENGTH / 2 - 1, HEIGHT / 2, HEIGHT - 1, 1, 1);			
    		} else {
    			int x = 0;
    			int y = 0;
    			for (y = (HEIGHT - 1); y >= (HEIGHT / 2); y--) {
    				for (x = 0; x < LENGTH / 2; x++) {
    					*(fb_mem + y * LENGTH + x) = 0xaaaaaa;
    				}
    			}
    		}
    		//Read((400,479)~(799,239))
    		if ((4 * (page - 1) + 3) < PICNUM) {
    			DrawLCD(bmp[4 * (page - 1) + 3], LENGTH / 2, LENGTH - 1, HEIGHT / 2, HEIGHT - 1, 1, 1);
    		} else {
    			int x = 0;
    			int y = 0;
    			for (y = (HEIGHT - 1); y >= (HEIGHT / 2); y--) {
    				for (x = LENGTH / 2; x < LENGTH; x++) {
    					*(fb_mem + y * LENGTH + x) = 0x969696;
    				}
    			}
    		}
    	}
    }
    
    void HeightLight() {  //为选中的图片绘制红框
    	if (choice >=0 && choice <= 3) {
    		int i = 0;
    		int offL = choice % 2;
    		int offH = choice / 2;
    		toPage(bmp);
    		for (i = (LENGTH / 2) * offL; i < (LENGTH / 2) * (offL + 1); i++) {
    			//四条横线
    			*(fb_mem + ((HEIGHT / 2) * offH) * LENGTH + i) = 0xff0000;
    			*(fb_mem + ((HEIGHT / 2) * offH + 1) * LENGTH + i) = 0xff0000;
    			*(fb_mem + ((HEIGHT / 2) * (offH + 1) - 2) * LENGTH + i) = 0xff0000;
    			*(fb_mem + ((HEIGHT / 2) * (offH + 1) - 1) * LENGTH + i) = 0xff0000;
    		}
    		for (i = (HEIGHT / 2) * offH + 2; i < ((HEIGHT / 2) * (offH + 1) - 2); i++) {
    			//四条竖线
    			*(fb_mem + i * LENGTH + (LENGTH / 2) * offL) = 0xff0000;
    			*(fb_mem + i * LENGTH + (LENGTH / 2) * offL + 1) = 0xff0000;				
    			*(fb_mem + i * LENGTH + (LENGTH / 2) * (offL + 1) - 1) = 0xff0000;				
    			*(fb_mem + i * LENGTH + (LENGTH / 2) * (offL + 1) - 2) = 0xff0000;
    		}
    	}
    }
    
    void getFile(DIR* dir) {  //读取图片文件
    	if (dir != NULL && bmp != NULL) {
    		int i = 0;
    		if (dir != NULL) {
    			struct dirent* d_p;
    			while ((d_p = readdir(dir)) != NULL && i < PICNUM) {
    				if(strstr(d_p->d_name,".bmp")) {
    					bmp[i] = fopen(d_p->d_name, "r");
    					if (bmp[i] == NULL) {
    						perror("Read Pic Failed!\n");
    						_exit(0);
    					}
    					i++;
    				}
    			}
    		}
    	}
    }
    
    void key_Return() {  //返回小图模式
    	if (isEnter == 1 && isOpen == 1) {
    		kill(pptpid, SIGINT);
    		toPage();
    		HeightLight();
    		isOpen = 0;
    	}
    }
    
    void key_Enter() {  //进入主程序
    	if (isEnter == 0) {
    		//Enter
    		toPage();
    		HeightLight();
    		isEnter = 1;
    	}
    }
    
    void key_Back() {  //退出程序
    	kill(pptpid, SIGINT);
    	DrawLCD(bmpEND, 0, LENGTH - 1, 0, HEIGHT - 1, 0, 0);
    	kill(DAEMON, QUITS);
    	isEnter = 0;
    	sleep(3);
    }
     
    void getNext(int sig) {
    	if (sig == RETURN) {
    		char buff[2];
    		read(pptfd[0], buff, 2);
    		page = buff[0];
    		choice = buff[1];
    	}
    }
     
    void pptQuit(int sig) {
    	if (sig == SIGINT) {
    		char buff[2];
    		buff[0] = page;
    		buff[1] = choice;
    		write(pptfd[1], buff, 2);
    		kill(getppid(), RETURN);
    		exit(0);
    	}
     }
    
    void* Thread(void* p) {
    	int arg = (int)p;
    	int num = arg / 10;
    	int method = arg % 10;
    	int x = 0;
    	int y = 0;
    	int pos = (3 - num) * (HEIGHT / 4) * 3 * LENGTH;
    	if (method == 0) {  //下向上
    		for (y = (num + 1) * (HEIGHT / 4) - 1; y >= num * (HEIGHT / 4); y--) {
    			for (x = 0; x <= LENGTH - 1; x++) {
    				*(fb_mem + y * LENGTH + x) = (buff[pos] << 0 | buff[pos + 1] << 8 | buff[pos + 2] << 16);
    				pos += 3;
    			}
    			usleep(3000);
    		}
    	} else if (method == 1) {  //左向右
    		for (x = num * (LENGTH / 4); x <= (num + 1) * (LENGTH / 4) - 1; x++) {
    			pos = 3 * x;
    			for (y = HEIGHT - 1; y >= 0; y--) {
    				*(fb_mem + y * LENGTH + x) = (buff[pos] << 0 | buff[pos + 1] << 8 | buff[pos + 2] << 16);
    				pos += 3 * LENGTH;
    			}
    			usleep(3000);
    		}
    	} else if (method == 2) {  //上向下
    		pos = ((4 - num) * (HEIGHT / 4) - 1) * 3 * LENGTH;  //偏移到每块的顶行
    		for (y = num * (HEIGHT / 4); y <= (num + 1) * (HEIGHT / 4) - 1; y++) {
    			for (x = 0; x <= LENGTH - 1; x++) {
    				*(fb_mem + y * LENGTH + x) = (buff[pos] << 0 | buff[pos + 1] << 8 | buff[pos + 2] << 16);  //扫描并显示一行
    				pos += 3;
    			}
    			pos = pos - 6 * LENGTH;  //回退两行,即刷新刚才一行的下边一行
    			//不回退的话就会显示刚才一行的上一行
    			usleep(3000);
    		}
    	} else if (method == 3) {  //右向左
    		for (x = (num + 1) * (LENGTH / 4) - 1; x >= num * (LENGTH / 4); x--) {
    			pos = 3 * x;
    			for (y = HEIGHT - 1; y >= 0; y--) {
    				*(fb_mem + y * LENGTH + x) = (buff[pos] << 0 | buff[pos + 1] << 8 | buff[pos + 2] << 16);
    				pos += 3 * LENGTH;
    			}
    			usleep(3000);
    		}
    	}
    	pthread_exit(NULL);
    }
    
    void DrawInWindows(FILE* bmps, int method) {
    	fseek(bmps, 54, SEEK_SET);
    	fread(buff, LENGTH * HEIGHT * 3, 1, bmps);
    	method = method % 10;
    //	method = 3;
    	pthread_t pth[THNUM];
    	int i = 0;
    	for (i = 0; i < THNUM; i++) {
    		pthread_create(&pth[i], NULL, Thread, (void*)(i * 10 + method));
    	}
    	for (i = 0; i < THNUM; i++) {
    		pthread_join(pth[i], NULL);
    	}
    }
    
    void key_Open() {  //打开选中的图片
    	if (isEnter == 1 && isOpen == 0 && choice >=0 && choice <= 3) {
    		//OPEN
    		int method = 0;
    		DrawInWindows(bmp[4 * (page - 1) + choice], method);
    		pipe(pptfd);
    		pptpid = fork();
    		if (pptpid == 0) {
    			close(pptfd[0]);
    			signal(SIGINT, pptQuit);
    			int current = 4 * (page - 1) + choice;
    			while (1) {
    				method = (method + 1) % 4;
    				sleep(3);
    				current = (current + 1) % PICNUM;
    				page = current / 4 + 1;
    				choice = current % 4;				
    				DrawInWindows(bmp[current], method);
    			}
    		} else if (pptpid != 0) {
    			close(pptfd[1]);
    			isOpen = 1;
    			signal(RETURN, getNext);
    		}
    	}
    }
    
    void key_PageUp() {  //上一页
    	if (isEnter == 1 && isOpen == 0) {
    		if (page <= 1) {  //已是第一页
    			page = pageSum;  //跳到最后一页
    		} else {
    			page--;
    		}
    		while (4 * (page - 1) + choice >= PICNUM) {
    			choice--;
    		}
    		toPage();
    		HeightLight();
    	}
    }
    
    void key_PageDown() {  //下一页
    	if (isEnter == 1 && isOpen == 0) {
    		if (page >= pageSum) {
    			page = 1;
    		} else {
    			page++;
    		}
    		while (4 * (page - 1) + choice >= PICNUM) {
    			choice--;
    		}
    		toPage();
    		HeightLight();
    	}
     }
    
    void key_Up() {  //上一张
    	if (isEnter == 1 && isOpen == 0) {
    		char flag = 'n';
    		if (choice <= 0) {
    			choice = 3;
    			flag = 'y';
    		} else {
    			choice--;
    			flag = 'y';
    		}
    		while (4 * (page - 1) + choice >= PICNUM) {
    			choice--;
    			flag = 'n';
    		}
    		if (flag == 'y') {
    			kill(DAEMON, UPS);
    			HeightLight();
    		}
    	}
    }
    
    void key_Down() {  //下一张
    	if (isEnter == 1 && isOpen == 0  && 4 * (page - 1) + choice < PICNUM) {
    		char flag = 'n';
    		if (choice >= 3) {
    			choice = 0;
    			flag = 'y';
    		} else {
    			choice++;
    			flag = 'y';
    		}
    		while (4 * (page - 1) + choice >= PICNUM) {
    			choice--;
    			flag = 'n';
    		}
    		if (flag == 'y') {
    			kill(DAEMON, DOWNS);
    			HeightLight();
    		}
    	}
    }
    
    int main(int argc ,char **argv) {
    	if ((PICNUM % 4) == 0) {
    		pageSum = PICNUM / 4;
    	} else {
    		pageSum = PICNUM / 4 + 1;
    	}
    
    
    	int flag = 1;  //循环标记
    	int ret = 0;
    	int lcdid = open(LCD, O_RDWR);
    	int fd = open(KEY, O_RDONLY);
    
    	bmpBEG = fopen(BEGIN, "r");  //进入、退出界面
    	bmpEND = fopen(END, "r");
    	
    	if(fd <= 2 || lcdid <= 2) {
    		perror(" open !");
    		return -1;
    	} else {
    		int x = 0;
    		int y = 0;
    		int i = 0;
    
    		DIR* dir = opendir(PICDIR);
    		if (dir != NULL) {
    			getFile(dir);
    			fb_mem = mmap(NULL, LENGTH * HEIGHT * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcdid, 0);	 
    			if (fb_mem != NULL) {
    				DrawLCD(bmpBEG, 0, LENGTH - 1, 0, HEIGHT - 1, 0, 0);
    				kill(DAEMON, BEGINS);  //开启
    				while (flag == 1) {
    					ret = read(fd, &key_value, sizeof(struct input_event));
    					if( ret != sizeof(struct input_event)) {
    						perror(" the file Ending!");
    						return -1;
    					}
    					if(key_value.type == EV_KEY) {  //按照键值进行分支跳转,请根据实际情况修改
    						if (key_value.value == 1) {  //按下时相应
    							switch(key_value.code) {
    								case ESC: {  //返回小图模式
    									key_Return();
    									break;
    								}
    								case HOME: {  //进入主程序
    									key_Enter();
    									break;
    								}
    								case POWER: {  //退出程序
    									key_Back();
    									flag = 0;
    									break;
    								}
    								case ENTER: {  //打开选中的图片
    									key_Open();
    									break;
    								}
    								case UP: {  //上一页
    									key_PageUp();
    									break;
    								}
    								case DOWN: {  //下一页
    									key_PageDown();
    									break;
    								}
    								case LEFT: {  //上一张图片
    									key_Up();
    									break;
    								}
    								case RIGHT: {  //下一张图片
    									key_Down();
    									break;
    								}
    								default: {
    									perror("Key Code Error!\n");
    								}
    							}
    						}
    					}
    				}
    				munmap(fb_mem, LENGTH * HEIGHT * 4);
    			}
    		}
    		ret  = close(fd);
    		if(ret < 0) {
    			perror(" close ! ");
    			return -1;	
    		}
    	}
    	return 0;
    }


    电子音乐相册的相册部分,配合移植后的MoboPlayer可以实现音乐电子相册的功能。


    展开全文
  • Linux项目开发—电子相册

    千次阅读 2020-03-19 11:56:17
    1.简述:电子相册,开发一个在ARM9开发板上的电子相册,实现图片的播放; 2.工具、材料:电脑(带有Ubuntu等系列Linux系统)、ARM9系列开发板、串口线一根、串口通信软件SecureCRT; 3.基本流程: a.编写好源代码...

    1.简述:电子相册,开发一个在ARM9开发板上的电子相册,实现图片的播放;

    2.工具、材料:电脑(带有Ubuntu等系列Linux系统)、ARM9系列开发板、串口线一根、串口通信软件SecureCRT;

    3.基本流程:

    a.编写好源代码后在Ubuntu上编译为arm指令的可执行文件;a1:Linux下编译一般用gcc,基本用法为:gcc example.c  -o out; a2:这样编译出来的可执行文件还不能直接在linux上执行,需要赋予权限:chmod +x out (+x  —— -x);a3:执行源程序:./out  ;

    b.经过a编译出来的可执行文件还是只能在电脑上执行,不能再arm开发板上面执行,这是因为arm和intel的汇编代码和指令集不一样,则需要通过使用gcc另一个方法:arm-linux-gcc example.c -o out ;

    c.编写好可在arm上执行的文件后则需要导入到开发板上,通过串口线连接开发板和电脑,打开SecureCRT,点击连接,选择对应的com接口,连接好后传输即可;再经过a2 a3;

     图1:效果展示

    4.系列知识补充:

    a.常用linux指令:除3中提到的几个外,补充如下  a1: cd   cd  / 跳转根目录   cd 文件夹 跳转到指定文件夹     note:可以只输入文件夹前几个字符用TAB补齐;a2:ls  显示当前文件夹下的文件, ls -l  查看详细信息;a3:su 切换用户  直接su 切换管理员root用户 ,su 用户名 切换对应用户,   note:有些可能会出现密码错误无法切换root用户,sudo passwd root 改一下密码,一般都可以解决; a4: rm   例如删库跑路指令: rm -rf /*   ,没事删删玩还可以,别删习惯了-_~; a5: mkdir 创建目录 ,对应删除目录:rmdir   note:文件夹不能和文件同名字的,这个在win下面也是对得;  a6:man  这是一个厉害的命令,可以man许多东西  note:  q退出,n、N搜索; a7:快捷键 ctrl c:退出正在执行的文件;ctrl l 清屏;

    b.linux的文件:例如屏幕文件:/dev/fb0,使用方法同样是open,write,close;对触摸屏操作,获取触摸轨迹方向;

    c.图片及播放:在这里我们采用bmp格式图片,即位图,这种图片是没有压缩的,读取既显示,采用双向循环链表把图片文件链接起来,根据获取到的触摸事件手指滑动方向来决定链表移动方向;

    5.部分代码及实现:

    1 头文件声明
    #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<stdlib.h>
    #include<string.h>
    
    2 定义各种变量
    int fd_lcd,*plcd;//屏幕文件,映射
    int fd_bmp;//图片文件
    
    
    3 相关函数定义
    1.对一个像素点进行操作,显示颜色
    
    void lcd_draw_point(int x,int y,int color)//写像素点函数
    {
    	if(x>=800||y>=480)//屏幕大小为480*800,超过范围输出显示超界并返回
    	{
    		printf("point limited\n");
    		return;
    	}
    	*(plcd+800*y+x)=color;//对应点进行赋值,显示对应颜色
    }
    
    2.对全屏进行颜色刷新为指定颜色
    
    void lcd_clean(int color)		//填充指定颜色
    {
    	int x,y;
    	for(y=0;y<480;y++)
    	{
    		for(x=0;x<800;x++)
    		{
    			lcd_draw_point(x,y,color);在全屏像素点逐个调用写像素点函数,显示指定颜色
    		}
    	}
    }
    
    3.对图片读取写入到屏幕文件显示出来,及显示动效
    
    void draw_pic(struct node * Q)//画图片
    {
    	xg++;//xg为图片显示动画效果,在这里设定3种效果,通过xg自加再对3求余对应各个效果
    	printf("\n\n%s\n\n",Q->picname);
    	fd_bmp=open(Q->picname,O_RDWR);//打开图片文件,Q->picname为链表元素值,图片名
    	if(fd_bmp == -1)//打开屏幕失败的返回值是-1
    	{
    		printf("open bmp  error\n");
    		return ;
    	}
    	char buf[800*450*3+54];//对应图片文件字节数
    	read(fd_bmp, buf, 800*450*3+54);//图片的颜色读入到buf数组
    	close(fd_bmp);//关闭图片文件
    	char b,g,r;
    	int color,i,x,y;
    	if(xg%3==0)//打印效果1,效果原理为按部分显示,将图片分为几个部分逐步显示出来,为突出动态效果,每个显示段中间使用暂停。
    	{
    		i = 0;
    		for(y=50;y>=0;y--)
    		{
    			for(x=0;x<800;x++)
    			{
    				b = buf[54+i];
    				g = buf[55+i];
    				r = buf[56+i];
    				color = (r<<16) | (g<<8) | b;
    				lcd_draw_point(x,y,color);//一个个显示颜色
    				i+=3;
    			}
    		}
    		…………
    		usleep(200);//暂停一会,毫秒级别
    		i = 0;
    		for(y=250;y>=0;y--)
    		{
    			for(x=0;x<800;x++)
    			{
    				b = buf[54+i];
    				g = buf[55+i];
    				r = buf[56+i];
    				color = (r<<16) | (g<<8) | b;
    				lcd_draw_point(x,y,color);
    				i+=3;
    			}
    		}
    		usleep(200);
    	}
    }
    
    4.根据手指滑动返回的参数控制链表顺序并将传入draw_pic()子程序显示相应的图片
    
    int touch(int f)//传递触摸方向的值和链表
    {
    	struct node * U;
    	U=L;
    	if(f==1)
    	{
    		fd_lcd=open("/dev/fb0",O_RDWR);//打开屏幕文件
    	if(fd_lcd= = -1)//打开失败返回-1
    	{
    		printf("open fd_lcd error\n");
    		return -1;
    	}
    	plcd=mmap(NULL,800*480*4,PROT_WRITE | PROT_READ, MAP_SHARED,fd_lcd,0);//把文件或设备映射到内存中,操作内存的数据就相当于操作屏幕
    	if(plcd == MAP_FAILED)
    		{
    			printf("mmap failed\n");
    			return -1;
    		}
    	printf("mmap success\n");
    		printf("shun xu \n");
    		L=U->next;
    		draw_pic(L);	
    		printf("shun xu \n");
    	munmap(plcd,800*480*4);
    	close(fd_lcd);
    	return 1;
    	}
    		
    	if(f==2)
    	{
    		fd_lcd=open("/dev/fb0",O_RDWR);//打开屏幕文件
    		if(fd_lcd==-1)
    		{
    			printf("open fd_lcd error\n");
    			return -1;
    		}
    		plcd=mmap(NULL,800*480*4,PROT_WRITE | PROT_READ, MAP_SHARED,fd_lcd,0);
    		if(plcd == MAP_FAILED)
    			{
    				printf("mmap failed\n");
    				return -1;
    			}
    		printf("mmap success\n");
    			printf("ni xu \n");
    			L=U->pre;
    			draw_pic(L);
    			printf("ni xu \n");
    		munmap(plcd,800*480*4);
    		close(fd_lcd);
    		return 1;
    	}
    }
    

    附:设计报告、 源代码

     

     

    展开全文
  • 基于嵌入式ARM-Linux电子相册设计方案 1.1 电子相册市场成长的必然性 1市场需求的必然性 在上世纪末本世纪初电子相册呈现迅速发展的势头普及型数码相机的分辨率由200万象素增长到现在的8001500万象素价格也由300...
  • 项目描述:(1)通过TQ2440开发板实现一个电子相册,用2440的按键实现各种操作并实现相应的中断定时(2)主要用到Linux下多进程异步运行,进程间通信和内存共享,信号量,帧缓冲区操作,同时用到select进行...

    1.实现功能:

    用LCD来显示图片结合按键来实现上一幅下一幅图片显示,加上自动播放图片功能

    2.开发时间:2012年8月

    3.所需环境:

    Linux虚拟机,交叉编译链4.3.3,ARM开发板

    4.项目描述:

    (1)通过TQ2440开发板实现一个电子相册,用2440的按键实现各种操作并实现相应的中断定时

    (2)主要用到Linux下多进程异步运行,进程间通信和内存共享,信号量,帧缓冲区操作,同时用到select进行监控,mmap()函数进行显示缓冲区的物理地址到用户空间的映射

    (3)实现ARM开发板按键驱动和测试程序

    (4)实现1341声卡移植,LCD移植

    具体LCD和1341声卡移植请看我其它的博客,这里主要说一下按键驱动,其实跟以前按键驱动差不多的,还有就是测试程序

    下面先看测试程序

    *功能电子相册

    *k1 自动放映相片带音乐

    *k2停止

    *k3停止或刚开始时下一幅图片

    *k4停止或刚开始时上一幅图片

    *

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    //把存放图片的数组包含进来

    extern unsigned char IMG_20120219_165753[];

    extern unsigned char IMG_20120130_142227[];

    extern unsigned char IMG_dyy[];

    extern unsigned char IMG_20120217_180320[];

    extern unsigned char IMG_20120219_170238[];

    extern unsigned char IMG_3625[];

    extern unsigned char IMG_3697[];

    //把计算大小的函数包含进来

    extern int cgy();

    extern int cgy1();

    extern int cgy2();

    extern int cgy3();

    extern int cgy4();

    extern int cgy5();

    extern int cgy6();

    //共享内存申请标记

    #define PERM

    S_IRUSR|S_IWUSR

    //双向循环列表:存放歌曲名

    struct

    song {

    char songname[20];

    struct song *prev;

    struct song *next;

    };

    //孙子进程id号

    pid_t gradchild;

    //子进程id号

    pid_t pid;

    //共享内存描述标记

    int shmid;

    char *p_addr;

    //播放标记

    int first_key=1;

    int play_flag=0;

    //帧缓冲区的标记

    int fbfd = 0;

    struct fb_var_screeninfo vinfo;//记录用户可修改的显示控制器参数

    unsigned long screensize = 0;

    char *fbp = 0;

    int x = 0,y = 0;

    int i = 0;

    //上一幅下一幅图片标记

    int nex1 = 0;

    int pre1 = 6;

    int bb;

    *************************************************

    Function name: play

    Parameter :

    struct song *

    Description : 播放函数

    Return : void

    Argument : void

    Autor & date : ada 09,12,07

    **************************************************

    void play(struct song *currentsong)

    {

    pid_t fd;

    char *c_addr;

    char *p;

    int len;

    char my_song[30]="/qd15/song/";

    while(currentsong)

    {

    //创建子进程,即孙子进程

    fd = fork();

    if(fd == -1)

    { perror("fork");

    exit(1);

    }

    else if(fd == 0)

    {

    //把歌曲名加上根路径

    strcat(my_song,currentsong->songname);

    p =

    my_song;

    len =

    strlen(p);

    //去掉文件名最后的'\n'

    my_song[len-1]='\0';

    printf("THIS

    SONG IS %s\n",my_song);

    execl("/qd15/madplay","madplay",my_song,NULL);

    }

    else

    {

    //内存映射

    c_addr =

    shmat(shmid,0,0);

    //把孙子进程的id和当前播放歌曲的节点指针传入共享内存

    memcpy(c_addr,&fd,sizeof(pid_t));

    memcpy(c_addr

    + sizeof(pid_t)+1,&currentsong,4);

    //显示图片函数

    for(i = 0;i < 7;i++){

    for(x = 0;x

    <= vinfo.xres;x++){

    long location = x * 2 ;

    switch(i){

    case 0 :

    bb =

    cgy();

    memcpy(fbp +

    location , IMG_20120130_142227 ,bb);

    break;

    case 1 :

    bb

    = cgy1();

    memcpy(fbp

    + location , IMG_20120219_165753 ,bb);

    break;

    case 2 :

    bb

    = cgy2();

    memcpy(fbp

    + location , IMG_20120219_170238 ,bb);

    break;

    case 3 :

    bb

    = cgy3();

    memcpy(fbp

    + location , IMG_dyy ,bb);

    break;

    case 4 :

    bb

    = cgy4();

    memcpy(fbp

    + location , IMG_20120217_180320 ,bb);

    break;

    case 5 :

    bb

    = cgy5();

    memcpy(fbp

    + location , IMG_3625 ,bb);

    break;

    case 6 :

    bb

    = cgy6();

    memcpy(fbp

    + location , IMG_3697 ,bb);

    break;

    }

    }

    // munmap(fbp,screensize);

    // close(fbfd);

    printf("\n\n\n");

    }

    //使用wait阻塞孙子进程,直到孙子进程播放完才能被唤醒;

    //当被唤醒时,表示播放MP3期间没有按键按下,则继续顺序播放下一首MP3

    if(fd ==

    wait(NULL))

    {

    currentsong

    = currentsong->next;

    printf("THE

    NEXT SONG IS %s\n",currentsong->songname);

    }

    }

    }

    }

    *************************************************

    Function name: creat_song_list

    Parameter :

    void

    Description : 创建歌曲名的双向循环链表

    Return : struct song *

    Argument : void

    Autor & date : ada 09.12.07

    **************************************************

    struct song *creat_song_list(void)

    { FILE *fd;

    size_t size;

    size_t len;

    char *line = NULL;

    struct song *head;

    struct song *p1;

    struct song *p2;

    system("ls /qd15/song

    >song_list");

    fd = fopen("song_list","r");

    p1 = (struct song *)malloc(sizeof(struct

    song));

    printf("==================================song

    list=====================================\n");

    system("ls /qd15/song"); printf("\n");

    printf("================================================================================\n");

    size =

    getline(&line,&len,fd);

    strncpy(p1->songname,line,strlen(line));

    head = p1;

    while((size =

    getline(&line,&len,fd)) !=

    -1)

    { p2 = p1;

    p1 = (struct song

    *)malloc(sizeof(struct song));

    strncpy(p1->songname,line,strlen(line));

    p2->next =

    p1;

    p1->prev =

    p2; }

    p1->next = head;

    head->prev = p1;

    p1 = NULL;

    p2 = NULL;

    system("rm -rf song_list");

    return head;

    }

    *************************************************

    Function name: startplay

    Parameter :

    pid_t *,struct song *

    Description : 开始播放函数

    Return : void

    Argument : void

    Autor & date : ada 09.12.07

    **************************************************

    void startplay(pid_t *childpid,struct song *my_song)

    {

    pid_t pid;

    int ret;

    //创建子进程

    pid = fork();

    if(pid > 0)

    {

    *childpid = pid;

    play_flag = 1;

    sleep(1);

    //把孙子进程的pid传给父进程

    memcpy(&gradchild,p_addr,sizeof(pid_t));

    }

    else if(0 == pid)

    { //子进程播放MP3函数

    play(my_song);

    }

    }

    *************************************************

    Function name: my_pause

    Parameter :

    pid_t

    Description : 暂停函数

    Return : void

    Argument : void

    Autor & date : ada 09,12,07

    **************************************************

    void my_pause(pid_t pid)

    {

    printf("=======================PAUSE!PRESS K1 TO

    CONTINUE===================\n");

    kill(pid,SIGSTOP); //对孙子进程发送SKGSTOP信号

    play_flag = 0;

    }

    *************************************************

    Function name: my_pause

    Parameter :

    pid_t

    Description : 停止播放函数

    Return : void

    Argument : void

    Autor & date : ada 09,12,07

    **************************************************

    void my_stop(pid_t g_pid)

    {

    printf("=======================STOP!PRESS K1

    TO START PLAY===================\n");

    kill(g_pid,SIGKILL); //对孙子进程发送SKGKILL信号

    kill(pid,SIGKILL); //对子进程发送SKGKILL信号

    first_key=1;

    }

    *************************************************

    Function name: conti_play

    Parameter :

    pid_t

    Description : 继续函数

    Return : void

    Argument : void

    Autor & date : ada 09,12,07

    **************************************************

    void conti_play(pid_t pid)

    {

    printf("===============================CONTINUE=============================\n");

    kill(pid,SIGCONT); //对孙子进程发送SIGCONT信号

    play_flag=1;

    }

    *************************************************

    Function name: next

    Parameter :

    pid_t

    Description : 下一首函数

    Return : void

    Argument : void

    Autor & date : ada 09.12.07

    **************************************************

    void next(pid_t next_pid)

    {

    struct song *nextsong;

    printf("===============================NEXT

    MP3=============================\n");

    //从共享内存获得孙子进程播放歌曲的节点指针

    memcpy(&nextsong,p_addr +

    sizeof(pid_t)+1,4);

    //指向下首歌曲的节点

    nextsong = nextsong->next;

    //杀死当前歌曲播放的子进程,孙子进程

    kill(pid,SIGKILL);

    kill(next_pid,SIGKILL);

    wait(NULL);

    startplay(&pid,nextsong);

    }

    *************************************************

    Function name: prev

    Parameter :

    pid_t

    Description : 上一首函数

    Return : void

    Argument : void

    Autor & date : yuanhui 09.12.08

    **************************************************

    void prev(pid_t prev_pid)

    {

    struct song *prevsong;

    //从共享内存获得孙子进程播放歌曲的节点指针

    printf("===============================PRIOR

    MP3=============================\n");

    memcpy(&prevsong,p_addr +

    sizeof(pid_t)+1,4);

    //指向上首歌曲的节点

    prevsong = prevsong->prev;

    //杀死当前歌曲播放的子进程,孙子进程

    kill(pid,SIGKILL);

    kill(prev_pid,SIGKILL);

    wait(NULL);

    startplay(&pid,prevsong);

    }

    //下一个图片

    void next1(int i)

    {

    for(x = 0;x <=

    vinfo.xres;x++){

    long location = x * 2 ;

    switch(i){

    case 0 :

    bb

    = cgy();

    memcpy(fbp

    + location , IMG_20120130_142227 ,bb);

    break;

    case 1 :

    bb

    = cgy1();

    memcpy(fbp

    + location , IMG_20120219_165753 ,bb);

    break;

    case 2 :

    bb

    = cgy2();

    memcpy(fbp

    + location , IMG_20120219_170238 ,bb);

    break;

    case 3 :

    bb

    = cgy3();

    memcpy(fbp

    + location , IMG_dyy ,bb);

    break;

    case 4 :

    bb

    = cgy4();

    memcpy(fbp

    + location , IMG_20120217_180320 ,bb);

    break;

    case 5 :

    bb

    = cgy5();

    memcpy(fbp

    + location , IMG_3625 ,bb);

    break;

    case 6 :

    bb

    = cgy6();

    memcpy(fbp

    + location , IMG_3697 ,bb);

    break;

    }

    }

    //

    nex1++;

    }

    //上一张图片

    void prev1(int i)

    {

    for(x = 0;x <=

    vinfo.xres;x++){

    long location = x * 2 ;

    switch(i){

    case 0 :

    bb

    = cgy();

    memcpy(fbp

    + location , IMG_20120130_142227 ,bb);

    break;

    case 1 :

    bb

    = cgy1();

    memcpy(fbp

    + location , IMG_20120219_165753 ,bb);

    break;

    case 2 :

    bb

    = cgy2();

    memcpy(fbp

    + location , IMG_20120219_170238 ,bb);

    break;

    case 3 :

    bb

    = cgy3();

    memcpy(fbp

    + location , IMG_dyy ,bb);

    break;

    case 4 :

    bb

    = cgy4();

    memcpy(fbp

    + location , IMG_20120217_180320 ,bb);

    break;

    case 5 :

    bb

    = cgy5();

    memcpy(fbp

    + location , IMG_3625 ,bb);

    break;

    case 6 :

    bb

    = cgy6();

    memcpy(fbp

    + location , IMG_3697 ,bb);

    break;

    }

    }

    // nex1--;

    }

    *************************************************

    Function name: main

    Parameter :

    void

    Description : 主函数

    Return : int

    Argument : void

    Autor & date : ada 09.12.07

    **************************************************

    int main(void)

    {

    int buttons_fd;

    int key_value;

    struct song *head;

    fbfd =

    open("/dev/fb0",O_RDWR);//打开/dev/fb0用于操作LCD

    if(!fbfd){

    printf("Error : cannot open framebuffer

    device.\n");

    exit (1);

    }

    printf("The framebuffer device was opened successfully \n");

    if(ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo)){//获得可变屏幕参数

    printf("Error reading variable

    information.\n");

    exit(1);

    }

    printf("%dx%d,

    �pp\n",vinfo.xres,vinfo.yres,vinfo.bits_per_pixel);

    if(vinfo.bits_per_pixel != 16) {

    printf("Error:not supported bits_per_pixer,it

    only supports 16 bit color\n");

    exit(1);

    }

    screensize = vinfo.xres * vinfo.yres * 2;//16位2个字节

    //将显示缓冲区的物理地址映射到用户空间

    fbp = (char *)mmap(0,screensize,PROT_READ |

    PROT_WRITE,MAP_SHARED,fbfd,0);

    if((int)fbp == -1){

    printf("Error: failed to map framebuffer device

    to memory .\n");

    exit(4);

    }

    printf("The framebuffer device was mapped to memory

    successfully.\n");

    //打开设备文件

    buttons_fd = open("/dev/buttons", 0);

    if (buttons_fd < 0) {

    perror("open device

    buttons");

    exit(1);

    }

    //创建播放列表

    head = creat_song_list();

    printf("===================================OPTION=======================================\n\n\n\n");

    printf(" K1:START/PAUSE K2:STOP K3:NEXT K4:PRIOR\n\n\n\n");

    printf("================================================================================\n");

    //共享内存:用于存放子进程ID,播放列表位置

    if((shmid = shmget(IPC_PRIVATE,5,PERM))==

    -1)

    exit(1);

    p_addr = shmat(shmid,0,0);

    memset(p_addr,'\0',1024);

    while(1)

    {

    fd_set rds;

    int ret;

    FD_ZERO(&rds);

    FD_SET(buttons_fd,

    &rds);

    //监听获取键值

    ret = select(buttons_fd + 1,

    &rds, NULL, NULL, NULL);

    if (ret <

    0)

    {

    perror("select");

    exit(1);

    }

    if (ret == 0)

    printf("Timeout.\n");

    else if (FD_ISSET(buttons_fd,

    &rds))

    {

    int ret =

    read(buttons_fd, &key_value, sizeof

    key_value);

    if (ret !=

    sizeof key_value)

    {

    if

    (errno != EAGAIN)

    perror("read

    buttons\n");

    continue;

    }

    else

    {

    //printf("buttons_value:

    %d\n", key_value+1);

    //首次播放并自动显示图片,必须是按键1

    if(first_key){

    switch(key_value)

    { case

    0:

    startplay(&pid,head);

    first_key=0;

    break;

    case

    1:

    case

    2:

    if(nex1

    == 7)

    nex1

    = 0;

    next1(nex1);

    pre1

    = nex1 - 1;

    nex1++;

    break;

    case

    3:

    //printf("=======================PRESS

    K1 TO START PLAY===================\n");

    //if(nex1

    >= 0)

    // nex1

    = nex1 - 2;

    if(pre1

    == -1 )

    pre1 = 6;

    prev1(pre1);

    nex1

    = pre1+1;

    pre1--;

    break;

    default:

    printf("=======================PRESS

    K1 TO START PLAY===================\n");

    展开全文
  • 基于粤嵌GEC6818开发板,开发板是contex-a53,在开发板LCD屏幕上的电子相册,注释非常详细,支持bmp和Jpeg两种格式的图片,内含最邻插值和双线性插值两种图片缩放算法,感兴趣的朋友可以下载来看一看,谢谢
  • 嵌入式linux--电子相册

    千次阅读 2017-07-09 09:54:20
    实验内容与要求:采用QT开发技术,在物联网实验箱上实现一个电子相框,系统上电启动后自动启动此电子相框程序。程序自动读取U盘中的所有图片,并自动按照5秒一张的时间间隔播放。图片自动在显示屏全屏显示(不能变形...
  • 需要用到虚拟机,./shll脚本打开驱动,再开一个终端运行可执行文件就可运行成功,用到了循环链表和io知识
  • PAGE PAGE PAGE PAGE 5 编号_ 版本_ <基于linux和QT的电子相册设计> 概要设计说明书 目录 TOC \o "1-3" \t "章,1,节,2,1级 条,3,2级 条,4" 第1章 引言 3 1.1 编写目的 3 1.2 术语 3 1.3 参考文献 3 第2章 系统概述 3...
  • 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。 首先是外部进程传参,传进的是某目录文件的路径(绝对路径/相对路径)。接着打开目录文件,遍历目录内所有...
  • ? 嵌入式工程师 项目实训 项目需求书 第一部分 项目概述 1 业务需求概述 传统相片无论从冲洗花费的资金和现实的保留问题对于人们来说都是一个需要解决的问题尤其对于热爱拍照但是大量的照片不能够重复冲洗再赠予好友...
  • UBUNTU 直接使用指令安装: sudo apt-get install videoporama ...其他版本的LINUX的可以到官网下载源码编译,WINDOWS则可直接下载EXE文件安装: 官网:http://www.videoporama.tuxfamily.org/index.php?z=11
  • Conky是一个显示系统状态的Linux软件,可以图形化显示CPU, 内存,网络流量等。下面是一个来自官方网站的示例图。 它的配置文件语法很简单,分为配置和显示两部分 conky.config={ own_window=true, own_window_...
  • Qt电子相册

    2014-07-12 18:28:27
    Qt电子相册 沈阳工程学院 mini2440 linux课设 课设高分作品,必过,无需修改,直接答辩就可
  • 嵌入式设备电子相册

    2018-05-28 22:39:04
    在嵌入式Linux设备上运行的电子相册软件,要求显示屏大小为800x480,可自行在代码修改,实现显示嵌入式设备图片功能,并能花样播放,设置密码等一系列功能
  • 电子相册程序设计.rar

    2020-03-19 11:54:08
    电子相册,语言:C语言,系统:Linux ,开发一个在ARM9开发板上的电子相册,实现图片的播放,控制切换图片
  • 1.在Linux环境下,用C语言高级编程中的多进程、进程间通讯、信号、链表、文件的读写等实现电子相册中音乐的播放、照片的自动播放、手动播放以及图片的浏览等功能。 2. 电子相册功能:进行9宫格预览,上一页,下一页...
  • 基于arm下的电子相册

    2018-12-08 00:54:18
    需要进行编译,是一款基于linux开发简易电子相册,存储的照片以文件的方式读取,有居中和缩放,可快速切换照片
  • 基于Linux系统的嵌入式实验,实现了菜单以及电子相册,文件内含有工程文件和流程图。进入相册有欢迎界面,停留3s后自动跳转;设置3个imagebutton,点击可以分别进入3个不同的相册;浏览图片时,当前浏览图片可以停留...
  • usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/ld: ERROR: Source object /usr/local/arm/4.3.2/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/libfr...
  • 学习检测:6818电子相册基础功能

    千次阅读 2020-08-03 08:52:58
    小项目检测:基于linux,在6818开发板上实现电子相册基础功能 学了一段时间的linuxC,测试一下自己的学习成果 功能很简单,就是编写程序,实现电子相册的一些简单功能 自动读取目标目录的图片文件信息 显示...
  • 基于TQ2440的电子相册项目实现

    千次阅读 2017-06-06 11:09:53
    1.实现功能: 用LCD来显示图片结合按键来实现上一幅下一幅图片显示...(1)通过TQ2440开发板实现一个电子相册,用2440的按键实现各种操作并实现相应的中断定时 (2)主要用到Linux下多进程异步运行,进程间通信和
  • 触摸屏电子相册 1、密码登录 (9键 6位密码登陆、36键 6位随机验证码) 2、电子相册功能(有自动浏览,手动浏览,上一张,下一张、划屏操作)  指定运用方法(用链表将当前目录下面的图片连接起来,链表采用双向...
  • ApowerShow – 功能齐全的电子相册制作软件 日常生活中,我们都习惯通过拍照来记录生活中的点点滴滴,如亲朋好友聚会,生日party,周年纪念日,婚礼现场等。 只要拥有了ApowerShow这款软件,你就能随时随地创造...

空空如也

空空如也

1 2 3 4
收藏数 64
精华内容 25
关键字:

linux电子相册

linux 订阅