Linux项目开发—电子相册

简介: Linux项目开发—电子相册,在ARM9开发板上的电子相册,实现图片的播放;

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;

image.png

图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>

image.gif

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;
  }
}

image.gif

附:设计报告、 源代码


相关文章
|
3月前
|
存储 Linux
Linux基础项目开发1:量产工具——改进优化(八)
Linux基础项目开发1:量产工具——改进优化(八)
36 0
Linux基础项目开发1:量产工具——改进优化(八)
|
3月前
|
Linux 测试技术
Linux基础项目开发1:量产工具——页面系统(六)
Linux基础项目开发1:量产工具——页面系统(六)
27 0
Linux基础项目开发1:量产工具——页面系统(六)
|
3月前
|
Linux 测试技术
Linux基础项目开发1:量产工具——UI系统(五)
Linux基础项目开发1:量产工具——UI系统(五)
33 0
Linux基础项目开发1:量产工具——UI系统(五)
|
3月前
|
Linux 测试技术
Linux基础项目开发1:量产工具——文字系统(四)
Linux基础项目开发1:量产工具——文字系统(四)
39 0
Linux基础项目开发1:量产工具——文字系统(四)
|
3月前
|
编解码 Linux
Linux基础项目开发1:量产工具——业务系统(七)
Linux基础项目开发1:量产工具——业务系统(七)
29 0
Linux基础项目开发1:量产工具——业务系统(七)
|
3月前
|
Linux 测试技术
Linux基础项目开发1:量产工具——输入系统(三)
Linux基础项目开发1:量产工具——输入系统(三)
52 0
Linux基础项目开发1:量产工具——输入系统(三)
|
3月前
|
编解码 Linux
Linux基础项目开发1:量产工具——显示系统(二)
Linux基础项目开发1:量产工具——显示系统(二)
41 0
Linux基础项目开发1:量产工具——显示系统(二)
|
3月前
|
Linux C语言
Linux基础项目开发1:量产工具——程序框架(一)
Linux基础项目开发1:量产工具——程序框架(一)
56 0
Linux基础项目开发1:量产工具——程序框架(一)
|
1天前
|
安全 网络协议 Linux
linux必学的60个命令
Linux是一个功能强大的操作系统,提供了许多常用的命令行工具,用于管理文件、目录、进程、网络和系统配置等。以下是Linux必学的60个命令的概览,但请注意,这里可能无法列出所有命令的完整语法和选项,仅作为参考