图片浏览器.docx
《图片浏览器.docx》由会员分享,可在线阅读,更多相关《图片浏览器.docx(21页珍藏版)》请在冰豆网上搜索。
图片浏览器
嵌入式课程设计报告
课程设计题目:
图片浏览器
班级:
12级软工移动一班
指导老师:
曹磊
学生:
黄兴全
目录
一.实验目的2
二.功能简介2
三.功能详细描述3
五、效果展示5
六.代码实现9
六.工程完成分工与自我打分情况15
一、实验目的
本程序是在Linux平台上运行的,依赖于c++与SDL制作一个图片浏览器,实现图片的正常浏览,并且能够实现在开发板上的正常浏览。
二.功能模块描述
SDL简介:
SDL(SimpleDirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。
SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、MacOSX等)的应用软件。
目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
制作的该图片浏览器重要有三大功能特点。
其一,图片浏览器能够在指定的目录下实现浏览,并可以任意添加图片删减图片。
其二,图片浏览器实现了对图片的放大与缩小,不易失真。
其三,图片浏览器实现了对图片的旋转。
功能总体描述:
本程序大量使用了SDL的库函数。
分两部分简介其功能。
(一)先对必要的每部分小的函数功能实现进行描述。
1、load_image():
通过调用库函数IMG_Load()与SDL_DisplayFormat()实现将图片优化成与屏幕相同的格式。
2、apply_surface():
通过调用SDL_BlitSurface()实现将源图片加载到屏幕上。
3、init():
对SDL库的初始化。
设置屏幕大小以及屏幕标题。
4、Free_Image():
实现对图片的释放。
5、Set_Image():
设置图片偏移量,使之显示在屏幕中间。
6、Show_Image():
实现图片的更新。
7、Zoom_Small()与Zoom_Big():
调用库函数zoomSurface()与boxColor()实现图片的缩小与放大。
8、Change_Angle():
调用rotozoomSurfaceXY()实现对图片的角度旋转。
(二)图片浏览器从大的方面说实现了三个功能1、实现对指定目录下图片的浏览。
先使用opendir()将指定目录打开,后使用readdir()文件信息并保存在structdirent*类型声明的file变量中,把读取的信息保存在filename[256][256]中,通过循环完成遍历文件的任务。
最后用closedir()函数关闭打开的文件夹。
2、实现了对图片的放大与缩小。
主要调用zoomSurface()来完成。
3、实现了对图片的角度旋转。
通过确定旋转度数的double*angle,再调用rotozoomSurfaceXY(image,*angle,*x,*x,1),使旋转后的图片显示在屏幕上。
下面对在main函数执行的流程进行一下简单描述。
先是调用init()进行初始化,接着调用trave_dir()函数打开指定文件,并将图片名保存在filename数组中。
将屏幕填充为白色加载第一张图片。
若有事件则进入循环。
若按上下键则刷新屏幕显示上一张或是下一张。
若变量j小于等于0则让j等于0,若j大于等于len则j就赋值为len-1。
若按s键则调用Zoom_Small()缩小图片。
若按b键调用Zoom_Big()放大图片。
若点击鼠标则旋转图片。
若关闭窗口则令quit=true。
最后调用SDL_Quit关闭SDL程序
1.到指定目录下动态读取图片
可在指定目录下任意增添删减图片后将目录下所存的图片全部读出,对任意图片进行浏览,灵活自如。
先使用opendir()将指定目录打开,后使用readdir()文件信息并保存在structdirent*类型声明的file变量中,把读取的信息保存在filename[256][256]中,通过循环完成遍历文件的任务。
最后用closedir()函数关闭打开的文件夹。
代码如下:
inttrave_dir(char*path)
{
DIR*d;//声明一个句柄
structdirent*file;//readdir函数的返回值就存放在这个结构体中
structstatsb;
if(!
(d=opendir(path)))
{
printf("erroropendir%s!
!
!
\n",path);
return-1;
}
while((file=readdir(d))!
=NULL)
{
//把当前目录.,上一级目录..及隐藏文件都去掉,避免死循环遍历目录
if(strncmp(file->d_name,".",1)==0)
continue;
strcpy(filename[len++],file->d_name);//保存遍历到的文件名
}
2.按键事件:
当我们想检查一个按键按下的动作时,就使用SDL_KEYDOWN事件类型检查,如果有按键按下,我们要检查是哪一个按键按下。
SDL_PollEvent()函数把事件结构体中的SDL_KEYDOWN数据作为一个命名为“key”的SDL_KeyboardEvent:
并且在“key”内部有一个keysysm结构体:
在keysysym内部有一个叫做sym的SDL_Key,每一个SDL_Key对应一个按键操作。
如果向左的方向键按下,sym就是SDLK_LEFT,并发送向左移动的消息;如果向右的方向键按下,sym就是SDLK_RIGHT,并发送向右移动的消息;如果向上的方向键按下,sym就是SDLK_UP,并发送向上移动的消息;如果向下的方向键按下,sym就会是SDLK_DOWN,并发送向下移动的消息;当建立的专门的消息画面接受到消息时(switch模块),消息就会显示到屏幕上。
当消息画面指针没有指向任何画面时,要使它指向NULL,什么也不传输。
当消息画面指针指向某个画面时,我们先把背景放到屏幕上,然后再把消息画面放置到屏幕上。
把消息画面指针重置为NULL后,刷新屏幕。
3.图片放大缩小功能的实现:
放大:
调用zoomSurface()函数,图片的长宽每次放大0.05,使之置于屏幕中部,刷新后显示出来。
代码如下:
voidZoomBig(double*x,SDL_Surface*image)
{
*x=*x+0.05;
SDL_Rectrect;
SDL_Surface*image_1;
image_1=zoomSurface(image,*x,*x,1);
boxColor(screen,0,0,screen->w,screen->h,0x000000ff);
rect=Set_Image(image_1,*x);
Show_Image(image_1,&rect);
Free_Image(image_1);
}
缩小:
调用zoomSurface()函数,图片的长宽每次缩小0.05,使之置于屏幕中部,刷新后显示出来。
代码如下:
voidZoom_Small(double*x,SDL_Surface*image)
{
SDL_Rectrect;
if(*x<=0)
return;
*x=*x-0.05;//每次缩小的量
//SDL_Surface*image;
SDL_Surface*image_1;
image_1=zoomSurface(image,*x,*x,10);
boxColor(screen,0,0,screen->w,screen->h,0x000000ff);
rect=Set_Image(image_1,*x);
Show_Image(image_1,&rect);
Free_Image(image_1);
}
4.图片旋转功能的实现:
申请double*变量来储存每次操作对图片旋转的度数,此值可任意设定,再次设定为每次旋转30度。
先将屏幕填充为黑色,后调用rotozoomSurfaceXY()函数来实现图片的旋转。
SDL_Surface*Change_Angle(SDL_Surface*image,double*angle,double*x)
{
SDL_Surface*change=NULL;
SDL_Rectrect;
*angle=*angle-30.0;
boxColor(screen,0,0,screen->w,screen->h,0x000000ff);
change=rotozoomSurfaceXY(image,*angle,*x,*x,1);
rect=Set_Image(change,*x);
Show_Image(change,&rect);
returnchange;
三、移植过程
(一)连接arm设备
2.windows下进入设备管理器修改com口,即com2高级设置115200
3.关闭360,金山卫士之类的。
4.打开虚拟机先不启动,编辑它,添加serialport下一步com2,网络接口为桥接。
5.启动虚拟机。
6.打开终端关闭防火墙setup
7.arm设置
minicom-s
set/dev/ttyS1
回车
7.保存退出
9.进入arm系统
10.再次打开一个终端
11.ifconfig查看pc本地ip
设置ip子网ifcongfigeth0192.168.1.1netmask255.255.255.0up
12.ping192.168.1.199(armip)验证pc与arm是否通
13.进入arm中端
pingpcip是否通
14.进pc终端修改gedit/etc/exports
/cc192.168.1.199(rw,sync)
15./目录下mkdircc
16.启动nfsservicenfsstart
17.cd/cc
18.交叉编译:
arm-linux-g++do.cpp–ofile–L/usr/arm/include/SDL–I/usr/arm/lib–lSDL–lSDL_image-lSDL_gfx
19.cp/usr/arm*/mnt/yaffs/Qtopion/lib-f
20.进入arm终端进行挂载
mountnfs192.168.1.1:
/cc/mnt/nfs
21.cd..
22.cd/mnt/nfs/cc
23../file
四、效果展示
(一)图片上下翻页
(二)图片放大缩小
(三)图片旋转
五.代码实现
#include"SDL.h"
#include"SDL_image.h"
#include
#include
#include
#include
#include
#include
#include"SDL_rotozoom.h"
#include"math.h"
#include"string.h"
#include"SDL_gfxPrimitives.h"
charfilename[256][256];
intlen=0;
intj=0;
//
constintSCREEN_WIDTH=640;
constintSCREEN_HEIGHT=480;
constintSCREEN_BPP=32;
SDL_Surface*image=NULL;
SDL_Surface*screen=NULL;
SDL_Eventevent;
inttrave_dir(char*path)
{
DIR*d;//声明一个句柄
structdirent*file;//readdir函数的返回值就存放在这个结构体中
structstatsb;
if(!
(d=opendir(path)))
{
printf("erroropendir%s!
!
!
\n",path);
return-1;
}
while((file=readdir(d))!
=NULL)
{
//把当前目录.,上一级目录..及隐藏文件都去掉,避免死循环遍历目录
if(strncmp(file->d_name,".",1)==0)
continue;
strcpy(filename[len++],file->d_name);//保存遍历到的文件名
}
closedir(d);
return0;
}
SDL_Surface*load_image(std:
:
stringfilename)
{
SDL_Surface*loadedimage=NULL;
SDL_Surface*optimizedimage=NULL;
loadedimage=IMG_Load(filename.c_str());
if(loadedimage!
=NULL)
{
optimizedimage=SDL_DisplayFormat(loadedimage);
SDL_FreeSurface(loadedimage);
}
returnoptimizedimage;
}
voidapply_surface(intx,inty,SDL_Surface*source,SDL_Surface*destination)//加载优化后的图片
{
SDL_Rectoffset;
offset.x=x;
offset.y=y;
SDL_BlitSurface(source,NULL,destination,&offset);
}
boolinit()
{
if(SDL_Init(SDL_INIT_EVERYTHING)==-1)
{
returnfalse;
}
screen=SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);
if(screen==NULL)
{
returnfalse;
}
SDL_WM_SetCaption("pictureview",NULL);
returntrue;
}
voidFree_Image(SDL_Surface*image)
{
SDL_FreeSurface(image);
}
//用来显示 image 图片,rect 可以调节位置
intShow_Image(SDL_Surface*image,SDL_Rect*rect)
{
SDL_BlitSurface(image,NULL,screen,rect);
SDL_UpdateRect(screen,0,0,0,0);
return0;
}
SDL_RectSet_Image(SDL_Surface*image,doublezoom)//使图片显示在屏幕中间
{
SDL_Rectrect;
rect.x=(screen->w-image->w)/2;
rect.y=(screen->h-image->h)/2;
returnrect;
}
voidZoom_Small(double*x,SDL_Surface*image)
{
SDL_Rectrect;
if(*x<=0)
return;
*x=*x-0.05;//每次缩小的量
//SDL_Surface*image;
SDL_Surface*image_1;
image_1=zoomSurface(image,*x,*x,10);
boxColor(screen,0,0,screen->w,screen->h,0x000000ff);
rect=Set_Image(image_1,*x);
Show_Image(image_1,&rect);
Free_Image(image_1);
}
voidZoom_Big(double*x,SDL_Surface*image)
{
*x=*x+0.05;
SDL_Rectrect;
SDL_Surface*image_1;
image_1=zoomSurface(image,*x,*x,1);
boxColor(screen,0,0,screen->w,screen->h,0x000000ff);
rect=Set_Image(image_1,*x);
Show_Image(image_1,&rect);
Free_Image(image_1);
}
SDL_Surface*Change_Angle(SDL_Surface*image,double*angle,double*x)
{
SDL_Surface*change=NULL;
SDL_Rectrect;
*angle=*angle-30.0;
boxColor(screen,0,0,screen->w,screen->h,0x000000ff);
change=rotozoomSurfaceXY(image,*angle,*x,*x,1);
rect=Set_Image(change,*x);
Show_Image(change,&rect);
returnchange;
}
intmain()
{
inti;
boolquit=false;
doublezoom_xy=1,angle=0;
if(init()==false)
{
return1;
}
trave_dir("/usr/m5");
SDL_FillRect(screen,&screen->clip_rect,SDL_MapRGB(screen->format,0xFF,0xFF,0xFF));
image=load_image(filename[0]);
apply_surface(0,0,image,screen);
if(SDL_Flip(screen)==-1)
{
return1;
}
while(quit==false)
{
while(SDL_PollEvent(&event))
{
if(event.type==SDL_KEYDOWN)
{
switch(event.key.keysym.sym)
{
caseSDLK_UP:
j--;break;
caseSDLK_DOWN:
j++;break;
}
if(j<=0)
j=0;
if(j>=len)
j=len-1;
SDL_FreeSurface(image);
SDL_FillRect(screen,&screen->clip_rect,SDL_MapRGB(screen->format,0xFF,0xFF,0xFF));
image=load_image(filename[j]);
apply_surface(0,0,image,screen);
if(SDL_Flip(screen)==-1)
{
return1;
}
if(event.key.keysym.sym==115)
{
printf("Theimageisbecomesmaller!
\n");
Zoom_Small(&zoom_xy,image);
printf("%lf\n",zoom_xy);
}
if(event.key.keysym.sym==98)
{
printf("Theimageisbecomebigger!
\n");
Zoom_Big(&zoom_xy,image);
printf("%lf\n",zoom_xy);
}
}
if(event.type==SDL_MOUSEBUTTONDOWN)
{
Change_Angle(image,&angle,&zoom_xy);
}
if(event.type==SDL_QUIT)
{
quit=true;
}
printf("nnnnnnnnnnnnnn\n\n");
}
}
SDL_FreeSurface(image);
SDL_Quit();
return0;
七.工程完成分工与自我打分情况
黄兴全:
总体设计、代码的设计与开发自我估分90
杨家艳:
浏览器的移植图片旋转功能的实现自我估分85
李晓丽:
文档的设计与撰写图片按键功能的实现自我估分85