图片浏览器.docx

上传人:b****2 文档编号:24461873 上传时间:2023-05-27 格式:DOCX 页数:21 大小:294.18KB
下载 相关 举报
图片浏览器.docx_第1页
第1页 / 共21页
图片浏览器.docx_第2页
第2页 / 共21页
图片浏览器.docx_第3页
第3页 / 共21页
图片浏览器.docx_第4页
第4页 / 共21页
图片浏览器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

图片浏览器.docx

《图片浏览器.docx》由会员分享,可在线阅读,更多相关《图片浏览器.docx(21页珍藏版)》请在冰豆网上搜索。

图片浏览器.docx

图片浏览器

 

嵌入式课程设计报告

 

课程设计题目:

图片浏览器

班级:

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

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1