《基于wince的图片播放器毕业论文.doc》由会员分享,可在线阅读,更多相关《基于wince的图片播放器毕业论文.doc(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式计算机系统大作业 题目: 图片播放器 院系: 电子与信息工程学院 专业年级: 电工理论与新技术 学生姓名: # 学号 #同组学生: # 学号 # 2013年12月29日目录一、需求分析11.1 意义11.2 发展情况11.3 开发技术目的2二、系统开发思想和开发环境32.1 系统开发思想32.2 开发环境32.3 采用的技术及特点3三、开发模块划分和说明43.1 模块及功能43.2 模块说明4四、核心代码及其说明4五、程序运行及测试135.1 运行配置135.2 运行界面135.3 程序测试14六、遇到的问题与解决方案及系统特点156.1 遇到的问题与解决方案156.2 系统整体特色15
2、七、心得体会16I嵌入式系统与优化大作业图片播放器一、需求分析1.1 意义图像是现代信息社会中最基本的信息,它使信息变得栩栩如生,更加符合人们的日常交流习惯,因此它成为人类获取和交换信息的主要来源。如今数字图像处理的应用日益广泛,逐步成为信息科学、工程学、医学等许多学科的重要基础,同时作为一种实用技术广泛应用于军事、气象、交通、探矿、水利、农业甚至娱乐等领域。尤其是价格低廉的高性能计算机和诸如数码相机及扫描仪这样的图像采集设备出现后,数字图像处理技术被大量的应用到影视、游戏等公众及娱乐领域,与人类的生活密切相关。处理信息量巨大,要求处理速度极高,实时产生高质量的图形图像是我们不断的追求目标。因
3、此本选题具有较好好的实用价值和意义。 1.2 发展情况目前图像处理的主流应用是图像的压缩,即通过互联网进行传递或在可视电话和视频会议中进行动态视频图像的压缩。可视电话是当今结合计算机图像和传统图像处理的技术,以期产生很高压缩比的交叉领域之一。所有这一切都是图像的“数字表达”这一不可抗拒的发展趋势的组成部分。事实上,20世纪最强大、应用最广泛的图像形式电视图像,也将不可避免的融入数字领域。 数字图像及其处理技术之所以发展的如此迅速并获得广泛的应用,与其自身的优点是息息相关的。1.再现性好 数字图像处理与模拟图像处理的根本不同在于,它不会因图像的存储、传输或复制等一系列变换操作而导致图像质量的退化
4、。只要图像在数字化时准确地表现了原稿,则数字图像处理过程始终能保持图像的再现。2.处理精度高 按目前的技术,几乎可将一幅模拟图像数字化为任意大小的二维数组,这主要取决于图像数字化设备的能力。现代扫描仪可以把每个像素的灰度等级量化为16位甚至更高,这意味着图像的数字化精度可以达到满足任一应用需求。对计算机而言,不论数组大小,也不论每个像素的位数多少,其处理程序几乎是一样的。换言之,从原理上讲不论图像的精度有多高,处理总是能实现的,只要在处理时改变程序中的数组参数就可以了。回想一下图像的模拟处理,为了要把处理精度提高一个数量级,就要大幅度地改进处理装置,这在经济上是极不合算的。3.适用面宽 图像可
5、以来自于多种信息源,它们可以是可见光图像,也可以是不可见的波谱图像(例如X射线图像、射线图像、超声波图像或红外图像等)。从图像反映的客观实体尺度看,可以小到电子显微镜图像,大到航空照片、遥感图像甚至天文望远镜图像。这些来自不同信息源的图像只要被变换为数字编码形式后,均是用二维数组表示的灰度图像(彩色图像也是由灰度图像组合成的,例如RGB图像由红、绿、蓝三个灰度图像组合而成),因而均可用计算机来处理。即只要针对不同的图像信息源,采取相应的图像信息采集措施,图像的数字处理方法可适用于任何一种图像。4. 灵活性高 图像处理大体上可分为图像的像质改善、图像分析和图像重建三大部分,每一部分均包含丰富的内
6、容。由于图像的光学处理从原理上讲只能进行线性运算,这极大地限制了光学图像处理能实现的目标。而数字图像处理不仅能完成线性运算,而且能实现非线性处理,即凡是可以用数学公式或逻辑关系来表达的一切运算均可用数字图像处理实现。1.3 开发技术目的随着多媒体和互联网的快速发展,图片浏览功能成了绝大部分计算机必不可少的基本功能之一。比如Windows操作系统自带的Windows图片浏览器、ACDSee看图软件等,都是为了方便用户查看、浏览及处理图片的优秀软件。同样,在相关嵌入式系统(如手机、MP4、数码相机等)中,图片浏览也成为了不可或缺的功能。为此,我们专门开发了一款基于WINCE系统的图片浏览器,主要实
7、现在WINCE系统上对图片进行显示、翻页、缩放、旋转以及简单的效果处理等。我们知道,图片浏览器作为一种常用的应用程序,其基本功能都是差不多的,比如显示一张图片,放大,缩小,旋转等等,因此我们实地亲自使用了在桌面环境下的一些图片应用程序,总结出一些比较基础的常用功能,来作为我们的程序的需求。二、系统开发思想和开发环境2.1 系统开发思想我们通过对一些桌面图片处理浏览程序进行研究,总结了它们的一些基本特征,从而构想出我们的设计方案。开发环境:Windows7开发工具:Microsoft Visual studio 2005硬件环境:计算机、嵌入式处理器运行环境:Windows7、Microsoft
8、 Visual studio 2005、WindowsCE 5.0(不包含图片浏览组件)、亿道嵌入式开发板EELiod270教学开发平台。2.2 开发环境由于本软件为单机软件,不需进行大量的数据读写和数据交换,故对系统硬件配置的要求并不高,只要能够平稳运行Windows操作系统的硬件平台,都能够使用本软件。本软件运行平台为Microsoft Windows 98/Me/NT/2000/XP/2003/7。 2.3 采用的技术及特点本软件采用C#来进行图像编程。其主要特点是:1、C#代码被编译成汇编语言,可以直接在处理器上运行,效率很高。2、C#直接控制内存的分配和释放,这虽繁琐,加大了编程的负
9、担,但却能有效地控制内存的使用。3、使用C#进行图像处理编程具有更大的灵活性。而在以C#为核心语言的可视化编程工具中,Microsoft Visual Studio以其自身许多优异的特性而获得了最为广泛的应用。鉴于以上的特点,本设计使用Microsoft Visual Studio 2005作为软件的开发平台。三、开发模块划分和说明3.1 模块及功能程序主要实现四大部分功能,叙述如下:(1) 图片显示模块:包括“打开”“删除”功能,主要把JPG、PNG、JPEG、GIF、TIF、BMP等格式的图片打开并显示在指定位置,或者删除已经打开的图片。(2) 图片浏览模块:包括“上一张”“下一张”“关闭
10、”功能,可以对文件夹里面的图片进行翻页浏览,以及关闭浏览模式。(3) 图片缩放模块:包括“放大”“缩小”功能,对图片进行缩放。(4) 图片旋转模块:包括“左旋转”“右选择”功能,每次旋转90度。3.2 模块说明模块的框图如下:四、核心代码及其说明using System;/using System.Linq;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;
11、using System.Collections;using System.IO;using System.Drawing.Imaging;namespace PictureBrowser1 public partial class Form1 : Form private String dirPath;/文件所在文件夹路径 private ArrayList fileInDir;/用ArrayList存储文件夹中图片文件 private int index;/图片文件索引,用以实现上一张、下一张浏览 private String curFile;/当前文件夹路径 private Bitmap
12、 curBmp;/当前文件夹位图 public Form1() InitializeComponent(); panel2.AutoScroll = true; /文件打开函数 private void open()if(this.openFileDialog1.ShowDialog() =DialogResult.OK)if(this.pictureBox1.Image != null)this.pictureBox1.Image.Dispose();this.pictureBox1.Image = null;String filename = this.openFileDialog1.Fi
13、leName;trycurFile = filename;curBmp = new Bitmap(curFile);this.pictureBox1.Image = curBmp;displayImage();dirPath = filename.Substring(0,filename.LastIndexOf();System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(dirPath);System.IO.FileInfo fileInfo = dirInfo.GetFiles();fileInDir = new Array
14、List();if(fileInDir.Count 0) fileInDir.Clear();foreach(FileInfo fi in fileInfo)if(fi.Extension = .JPG | fi.Extension = .jpg | fi.Extension = .jpeg | fi.Extension = .tif | fi.Extension = .png | fi.Extension = .bmp | fi.Extension = .Bmp | fi.Extension = .gif | fi.Extension = .GIF)fileInDir.Add(fi.Full
15、Name.ToString();for(index = 0;index fileInDir.Count;index+)if(fileInDirindex.ToString() = filename)break;catch(Exception excep)Console.WriteLine(excep);MessageBox.Show(请选择后缀名为”JPG/PNG/JPEG/GIF/TIF/BMP”的图片!, 温馨提醒!);elseMessageBox.Show(请先选择一张图片!, 温馨提醒!); /文件关闭函数private void close()if(this.pictureBox1.
16、Image != null) this.pictureBox1.Image.Dispose();this.pictureBox1.Image = null;curFile = ;curBmp = null; /下一张private void next()tryif(index = fileInDir.Count - 1)MessageBox.Show(这已经是最后一张了., 温馨提醒!);elsethis.pictureBox1.Image.Dispose();curFile = fileInDir+index.ToString();curBmp = new Bitmap(curFile);t
17、his.pictureBox1.Image = curBmp;displayImage();catch (NullReferenceException)MessageBox.Show(请先打开一张图片!, 温馨提醒!);/上一张private void previous() try if (index = 0) MessageBox.Show(这已经是第一张了., 温馨提醒!);elsethis.pictureBox1.Image.Dispose();curFile = fileInDir-index.ToString();curBmp = new Bitmap(curFile);this.p
18、ictureBox1.Image = curBmp;displayImage();catch (NullReferenceException)MessageBox.Show(请先打开一张图片!, 温馨提醒!); /放大函数private void max()tryint w = (int)(this.pictureBox1.Image.Width * 1.1);int h = (int)(this.pictureBox1.Image.Height * 1.1);Bitmap bmpo = curBmp;Bitmap bmpn = new Bitmap(w, h);Graphics g = Gr
19、aphics.FromImage(bmpn); g.DrawImage(bmpo,new Rectangle(0, 0, w, h),new Rectangle(0, 0, bmpo.Width, bmpo.Height), GraphicsUnit.Pixel);g.Dispose();curBmp = bmpn;this.pictureBox1.Image.Dispose();this.pictureBox1.Image = curBmp;displayImage();catch(NullReferenceException)MessageBox.Show(请先打开一张图片!, 温馨提醒!
20、); 缩小函数private void min()tryint w = (int)(this.pictureBox1.Image.Width * 0.9);int h = (int)(this.pictureBox1.Image.Height * 0.9);Bitmap bmpo = curBmp;Bitmap bmpn = new Bitmap(w, h);Graphics g = Graphics.FromImage(bmpn); g.DrawImage(bmpo, new Rectangle(0, 0, w, h), new Rectangle(0, 0, bmpo.Width, bmp
21、o.Height), GraphicsUnit.Pixel);g.Dispose();curBmp = bmpn;this.pictureBox1.Image.Dispose();this.pictureBox1.Image = curBmp;displayImage();catch(NullReferenceException)MessageBox.Show(请先打开一张图片!, 温馨提醒!);/左旋转private void left()tryBitmap originalBitmap = curBmp;int rotationAngle = 270;int newWidth = orig
22、inalBitmap.Height;int newHeight = originalBitmap.Width;Bitmap rotatedBitmap = new Bitmap(newWidth, newHeight);#if ALLOW_UNSAFE_CODEinternalRotateImage(rotationAngle, originalBitmap, rotatedBitmap);#elseinternalRotateImage(rotationAngle, originalBitmap, rotatedBitmap);#endifthis.pictureBox1.Image = r
23、otatedBitmap;curBmp = rotatedBitmap;displayImage();catch(NullReferenceException)MessageBox.Show(请先打开一张图片!, 温馨提醒!);/右旋转private void right()tryBitmap originalBitmap = curBmp;int rotationAngle = 90;int newWidth = originalBitmap.Height;int newHeight = originalBitmap.Width;Bitmap rotatedBitmap = new Bitm
24、ap(newWidth, newHeight);#if ALLOW_UNSAFE_CODEinternalRotateImage(rotationAngle, originalBitmap, rotatedBitmap);#elseinternalRotateImage(rotationAngle, originalBitmap, rotatedBitmap);#endifthis.pictureBox1.Image = rotatedBitmap;curBmp = rotatedBitmap;displayImage();catch(NullReferenceException)Messag
25、eBox.Show(请先打开一张图片!, 温馨提醒!);/调用函数,实现图片旋转#if ALLOW_UNSAFE_CODEprivate static void InternalRotateImage(int rotationAngle, Bitmap originaBitmap, Bitmap rotatedBitmap)int newWidth = rotatedBitmap.Width;int newHeight = rotatedBitmap.Height; int orignalWidth = orignalBitmap.Width;int orignalHeigth = orign
26、alBitmap.Heigth;int newWidthMinusOne = newWidth-1;int newHeightMinusOne = newHeight-1;BitmapData originalData = originalBitmap.LockBits(new Rectangle(0,0,originalWidth, originalHeight), ImageLockMode.ReadOnly, PixelFormat32bppRgb);BitmapData rotatedData = rotatedBitmap.LockBits(new Rectangle(0,0,rot
27、atedBitmap.Width, rotatedBitmap.Height),ImageLockMode.WriteOnly,PixelFormat.Format32bppRgb);unsafeint* originalPoiner = (int*)orignalData.Scan0.ToPointer();int* rotatedPointer = (int*)rotatedData.Scan0.ToPointer();switch(rotationAngle)case 90:for(int y = 0; y originalHeight; +y)int destinationX = ne
28、wWidthMinusOne - y;for (int x =0; x originalWidth; +x)int sourcePosition = (x+y * originalWidth);int destinationY = x;int destinationPosition = (destinationX + detinationY * nowWidth);rotatedPointordestinationPosition = originalPointorsourcePosition;break;case 270:for (int y=0; y originalHeight; +y)
29、int destinationX = y;for (int x = 0; x originalWidth; +x)int sourcePosition = (x+y*originalWidth);int destinationY = newHeightMinusOne - x;int destinationPosition = (destinationX + destinationY * newWidth);rotatedPointerdestinationPosition = originalPointorsourcePosition;break;originalBitmap.UnlockB
30、its(originalData);rotatedBitmap.UnlockBits(rotatedData);#else/图片选择实现函数private static void internalRotateImage(int rotationAngle, Bitmap originalBitmap, Bitmap rotatedBitmap) int rotatedWidthMinusOne = rotatedBitmap.Width - 1; int rotatedHeightMinusOne = rotatedBitmap.Height - 1; int originalWidth =
31、originalBitmap.Width; int originalHeight = originalBitmap.Height; switch (rotationAngle) case 90: for (int y = 0; y originalHeight; +y) for (int x = 0; x originalWidth; +x) rotatedBitmap.SetPixel(rotatedWidthMinusOne - y, x, originalBitmap.GetPixel(x, y); break; case 270: for (int y = 0; y originalH
32、eight; +y) for (int x = 0; x originalWidth; +x) rotatedBitmap.SetPixel(y, rotatedHeightMinusOne - x, originalBitmap.GetPixel(x, y); break; #endif /图片删除private void delete()DialogResult dlgResult = MessageBox.Show(您确定要删除此图片?, 信息提示, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaul
33、tButton.Button1);if(dlgResult = DialogResult.OK)File.Delete(fileInDirindex.ToString();fileInDirindex = fileInDir+index;curFile = fileInDirindex.ToString();curBmp = new Bitmap(curFile);this.pictureBox1.Image = curBmp; /图片显示自定义private void displayImage()this.pictureBox1.Height = curBmp.Height;this.pic
34、tureBox1.Width = curBmp.Width;pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;if (pictureBox1.Width panel2.Width)pictureBox1.Left = (panel2.Width - pictureBox1.Width)/2;elsepictureBox1.Left = 0;if (pictureBox1.Height panel2.Height)pictureBox1.Top = (panel2.Height - (pictureBox1.Height)/2);els
35、epictureBox1.Top = 0;点击界面中的各个按钮(如打开、上一张、下一张等),将下面对应的程序输入进去。 private void button1_Click(object sender, EventArgs e) open(); private void button2_Click(object sender, EventArgs e) previous(); private void button3_Click(object sender, EventArgs e) next(); private void button4_Click(object sender, Event
36、Args e) delete(); private void button5_Click(object sender, EventArgs e) max(); private void button6_Click(object sender, EventArgs e) min(); private void button7_Click(object sender, EventArgs e) right(); private void button8_Click(object sender, EventArgs e) left(); private void button9_Click(obje
37、ct sender, EventArgs e) close(); 五、程序运行及测试5.1 运行配置 考虑到绝大部分的计算机专业用户,本软件的运行配置要也并不高。只需一台普通的台式计算机或者笔记本电脑,Windows 98及以上的操作系统,并装有Microsoft Visual studio 2005及以上版本的软件即可运行本程序,对计算机内存、处理器、硬盘等也无特殊要求。5.2 运行界面在界面设计中,我们参考了大众化软件常用界面,以图片显示区域为中心,设置快速操作按钮,方便用户快速使用对图片进行操作的功能。整体效果如下所示:打开一张图片,程序运行结果如下图:5.3 程序测试1、打开功能测试结
38、果如下所示:图片格式能否打开显示效果JPG能完美PNG能完美JPEG能完美GIF能能打开,但没有动态效果TIF否没效果BMP能完美2、图片浏览、旋转等功能测试结果如下:按钮名称结果按钮名称结果上一张正常放大正常下一张正常缩小正常左旋转正常删除正常右旋转正常关闭正常六、遇到的问题与解决方案及系统特点6.1 遇到的问题与解决方案设计界面时,根据我们对其它图片播放器产品的观察,我们本来打算采用菜单栏和工具条来构成主要的界面。但在WINCE系统中,工具条的按钮项只能用图片集Imagelist中的图像来表示,不支持文字Text。这样如果图片太小,用户可能就看不清各个按钮项的功能。为了方便使用,我们决定舍
39、弃工具条而采用放在面板Panel中排成一列的按钮Button控件来起到相同的效果。6.2 系统整体特色 本软件为一个简单而且很实用的图片播放器,不仅可以进行图片的简单查看、浏览操作,还可以实现放大、缩小、左旋转、右旋转等功能,是一款在嵌入式环境下比较适合广大计算机用户和非专业的用户的图片查看处理软件。考虑到普通大众的实际情况,软件不仅功能齐全而且不累赘,与此同时,界面设置友好,操作风格与桌面大众化程序保持一致。七、心得体会经过近半个月的努力,我们终于将这个基于WINCE的图片播放器软件做出来了。从最初的找资料,到在电脑上不断的运行、修改、完善,到最后的终于成功实现,每一步都凝聚了我们的心血。特别是中间一段时间,经过数次努力仍然不得要领,仍然是改了旧错误出现新错误,我们一个组的同学们甚至一致决定换个题目,这其中夹杂着我们多少的失望。还好,在最后一刻的灵光一闪,情况出现了转机,我们决定坚持下去。皇天不负有心人,剔除了数个错误之后,程序终于运行成功了!这种通过自己努力获得成功的美好感受,是本次设计带给我最难忘的回忆。通过本次设计,我们体会到了编程序的乐趣,它完全颠覆了以前那种编程是很无聊的工作的错误印象。不仅提
限制150内