基于wince的图片播放器.docx
《基于wince的图片播放器.docx》由会员分享,可在线阅读,更多相关《基于wince的图片播放器.docx(23页珍藏版)》请在冰点文库上搜索。
基于wince的图片播放器
嵌入式计算机系统大作业
题 目:
图片播放器
院 系:
电子与信息工程学院
专业年级:
电工理论与新技术
学生姓名:
######学号############
同组学生:
######学号############
2013年12月29日
图片播放器
一、需求分析
1.1意义
图像是现代信息社会中最基本的信息,它使信息变得栩栩如生,更加符合人们的日常交流习惯,因此它成为人类获取和交换信息的主要来源。
如今数字图像处理的应用日益广泛,逐步成为信息科学、工程学、医学等许多学科的重要基础,同时作为一种实用技术广泛应用于军事、气象、交通、探矿、水利、农业甚至娱乐等领域。
尤其是价格低廉的高性能计算机和诸如数码相机及扫描仪这样的图像采集设备出现后,数字图像处理技术被大量的应用到影视、游戏等公众及娱乐领域,与人类的生活密切相关。
处理信息量巨大,要求处理速度极高,实时产生高质量的图形图像是我们不断的追求目标。
因此本选题具有较好好的实用价值和意义。
1.2发展情况
目前图像处理的主流应用是图像的压缩,即通过互联网进行传递或在可视电话和视频会议中进行动态视频图像的压缩。
可视电话是当今结合计算机图像和传统图像处理的技术,以期产生很高压缩比的交叉领域之一。
所有这一切都是图像的“数字表达”这一不可抗拒的发展趋势的组成部分。
事实上,20世纪最强大、应用最广泛的图像形式——电视图像,也将不可避免的融入数字领域。
数字图像及其处理技术之所以发展的如此迅速并获得广泛的应用,与其自身的优点是息息相关的。
1.再现性好
数字图像处理与模拟图像处理的根本不同在于,它不会因图像的存储、传输或复制等一系列变换操作而导致图像质量的退化。
只要图像在数字化时准确地表现了原稿,则数字图像处理过程始终能保持图像的再现。
2.处理精度高
按目前的技术,几乎可将一幅模拟图像数字化为任意大小的二维数组,这主要取决于图像数字化设备的能力。
现代扫描仪可以把每个像素的灰度等级量化为16位甚至更高,这意味着图像的数字化精度可以达到满足任一应用需求。
对计算机而言,不论数组大小,也不论每个像素的位数多少,其处理程序几乎是一样的。
换言之,从原理上讲不论图像的精度有多高,处理总是能实现的,只要在处理时改变程序中的数组参数就可以了。
回想一下图像的模拟处理,为了要把处理精度提高一个数量级,就要大幅度地改进处理装置,这在经济上是极不合算的。
3. 适用面宽
图像可以来自于多种信息源,它们可以是可见光图像,也可以是不可见的波谱图像(例如X射线图像、射线图像、超声波图像或红外图像等)。
从图像反映的客观实体尺度看,可以小到电子显微镜图像,大到航空照片、遥感图像甚至天文望远镜图像。
这些来自不同信息源的图像只要被变换为数字编码形式后,均是用二维数组表示的灰度图像(彩色图像也是由灰度图像组合成的,例如RGB图像由红、绿、蓝三个灰度图像组合而成),因而均可用计算机来处理。
即只要针对不同的图像信息源,采取相应的图像信息采集措施,图像的数字处理方法可适用于任何一种图像。
4. 灵活性高
图像处理大体上可分为图像的像质改善、图像分析和图像重建三大部分,每一部分均包含丰富的内容。
由于图像的光学处理从原理上讲只能进行线性运算,这极大地限制了光学图像处理能实现的目标。
而数字图像处理不仅能完成线性运算,而且能实现非线性处理,即凡是可以用数学公式或逻辑关系来表达的一切运算均可用数字图像处理实现。
1.3开发技术目的
随着多媒体和互联网的快速发展,图片浏览功能成了绝大部分计算机必不可少的基本功能之一。
比如Windows操作系统自带的Windows图片浏览器、ACDSee看图软件等,都是为了方便用户查看、浏览及处理图片的优秀软件。
同样,在相关嵌入式系统(如手机、MP4、数码相机等)中,图片浏览也成为了不可或缺的功能。
为此,我们专门开发了一款基于WINCE系统的图片浏览器,主要实现在WINCE系统上对图片进行显示、翻页、缩放、旋转以及简单的效果处理等。
我们知道,图片浏览器作为一种常用的应用程序,其基本功能都是差不多的,比如显示一张图片,放大,缩小,旋转等等,因此我们实地亲自使用了在桌面环境下的一些图片应用程序,总结出一些比较基础的常用功能,来作为我们的程序的需求。
二、系统开发思想和开发环境
2.1系统开发思想
我们通过对一些桌面图片处理浏览程序进行研究,总结了它们的一些基本特征,从而构想出我们的设计方案。
开发环境:
Windows7
开发工具:
MicrosoftVisualstudio2005
硬件环境:
计算机、嵌入式处理器
运行环境:
Windows7、MicrosoftVisualstudio2005、WindowsCE5.0(不包含图片浏览组件)、亿道嵌入式开发板EELiod270教学开发平台。
2.2开发环境
由于本软件为单机软件,不需进行大量的数据读写和数据交换,故对系统硬件配置的要求并不高,只要能够平稳运行Windows操作系统的硬件平台,都能够使用本软件。
本软件运行平台为MicrosoftWindows98/Me/NT/2000/XP/2003/7。
2.3采用的技术及特点
本软件采用C#来进行图像编程。
其主要特点是:
1、C#代码被编译成汇编语言,可以直接在处理器上运行,效率很高。
2、C#直接控制内存的分配和释放,这虽繁琐,加大了编程的负担,但却能有效地控制内存的使用。
3、使用C#进行图像处理编程具有更大的灵活性。
而在以C#为核心语言的可视化编程工具中,MicrosoftVisualStudio以其自身许多优异的特性而获得了最为广泛的应用。
鉴于以上的特点,本设计使用MicrosoftVisualStudio2005作为软件的开发平台。
三、开发模块划分和说明
3.1模块及功能
程序主要实现四大部分功能,叙述如下:
(1)图片显示模块:
包括“打开”“删除”功能,主要把JPG、PNG、JPEG、GIF、TIF、BMP等格式的图片打开并显示在指定位置,或者删除已经打开的图片。
(2)图片浏览模块:
包括“上一张”“下一张”“关闭”功能,可以对文件夹里面的图片进行翻页浏览,以及关闭浏览模式。
(3)图片缩放模块:
包括“放大”“缩小”功能,对图片进行缩放。
(4)图片旋转模块:
包括“左旋转”“右选择”功能,每次旋转90度。
3.2模块说明
模块的框图如下:
四、核心代码及其说明
usingSystem;
//usingSystem.Linq;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Collections;
usingSystem.IO;
usingSystem.Drawing.Imaging;
namespacePictureBrowser1
{
publicpartialclassForm1:
Form
{
privateStringdirPath;//文件所在文件夹路径
privateArrayListfileInDir;//用ArrayList存储文件夹中图片文件
privateintindex;//图片文件索引,用以实现上一张、下一张浏览
privateStringcurFile;//当前文件夹路径
privateBitmapcurBmp;//当前文件夹位图
publicForm1()
{
InitializeComponent();
panel2.AutoScroll=true;
}
//文件打开函数
privatevoidopen()
{
if(this.openFileDialog1.ShowDialog()==DialogResult.OK)
{
if(this.pictureBox1.Image!
=null)
{
this.pictureBox1.Image.Dispose();
this.pictureBox1.Image=null;
}
Stringfilename=this.openFileDialog1.FileName;
try
{
curFile=filename;
curBmp=newBitmap(curFile);
this.pictureBox1.Image=curBmp;
displayImage();
dirPath=filename.Substring(0,filename.LastIndexOf("\\"));
System.IO.DirectoryInfodirInfo=newSystem.IO.DirectoryInfo(dirPath);
System.IO.FileInfo[]fileInfo=dirInfo.GetFiles();
fileInDir=newArrayList();
if(fileInDir.Count>0)
fileInDir.Clear();
foreach(FileInfofiinfileInfo)
{
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.FullName.ToString());
}
}
for(index=0;index{
if(fileInDir[index].ToString()==filename)
{
break;
}
}
}
catch(Exceptionexcep)
{
Console.WriteLine(excep);
MessageBox.Show("请选择后缀名为”JPG/PNG/JPEG/GIF/TIF/BMP”的图片!
","温馨提醒!
");
}
}
else
{
MessageBox.Show("请先选择一张图片!
","温馨提醒!
");
}
}
//文件关闭函数
privatevoidclose()
{
if(this.pictureBox1.Image!
=null)
{
this.pictureBox1.Image.Dispose();
this.pictureBox1.Image=null;
curFile="";
curBmp=null;
}
}
//下一张
privatevoidnext()
{
try
{
if(index==fileInDir.Count-1)
{
MessageBox.Show("这已经是最后一张了.","温馨提醒!
");
}
else
{
this.pictureBox1.Image.Dispose();
curFile=fileInDir[++index].ToString();
curBmp=newBitmap(curFile);
this.pictureBox1.Image=curBmp;
displayImage();
}
}
catch(NullReferenceException)
{
MessageBox.Show("请先打开一张图片!
","温馨提醒!
");
}
}
//上一张
privatevoidprevious()
{
try
{
if(index==0)
{
MessageBox.Show("这已经是第一张了.","温馨提醒!
");
}
else
{
this.pictureBox1.Image.Dispose();
curFile=fileInDir[--index].ToString();
curBmp=newBitmap(curFile);
this.pictureBox1.Image=curBmp;
displayImage();
}
}
catch(NullReferenceException)
{
MessageBox.Show("请先打开一张图片!
","温馨提醒!
");
}
}
//放大函数
privatevoidmax()
{
try
{
intw=(int)(this.pictureBox1.Image.Width*1.1);
inth=(int)(this.pictureBox1.Image.Height*1.1);
Bitmapbmpo=curBmp;
Bitmapbmpn=newBitmap(w,h);
Graphicsg=Graphics.FromImage(bmpn);
g.DrawImage(bmpo,newRectangle(0,0,w,h),newRectangle(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("请先打开一张图片!
","温馨提醒!
");
}
}
缩小函数
privatevoidmin()
{
try
{
intw=(int)(this.pictureBox1.Image.Width*0.9);
inth=(int)(this.pictureBox1.Image.Height*0.9);
Bitmapbmpo=curBmp;
Bitmapbmpn=newBitmap(w,h);
Graphicsg=Graphics.FromImage(bmpn);
g.DrawImage(bmpo,newRectangle(0,0,w,h),newRectangle(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("请先打开一张图片!
","温馨提醒!
");
}
}
//左旋转
privatevoidleft()
{
try
{
BitmaporiginalBitmap=curBmp;
introtationAngle=270;
intnewWidth=originalBitmap.Height;
intnewHeight=originalBitmap.Width;
BitmaprotatedBitmap=newBitmap(newWidth,newHeight);
#ifALLOW_UNSAFE_CODE
internalRotateImage(rotationAngle,originalBitmap,rotatedBitmap);
#else
internalRotateImage(rotationAngle,originalBitmap,rotatedBitmap);
#endif
this.pictureBox1.Image=rotatedBitmap;
curBmp=rotatedBitmap;
displayImage();
}
catch(NullReferenceException)
{
MessageBox.Show("请先打开一张图片!
","温馨提醒!
");
}
}
//右旋转
privatevoidright()
{
try
{
BitmaporiginalBitmap=curBmp;
introtationAngle=90;
intnewWidth=originalBitmap.Height;
intnewHeight=originalBitmap.Width;
BitmaprotatedBitmap=newBitmap(newWidth,newHeight);
#ifALLOW_UNSAFE_CODE
internalRotateImage(rotationAngle,originalBitmap,rotatedBitmap);
#else
internalRotateImage(rotationAngle,originalBitmap,rotatedBitmap);
#endif
this.pictureBox1.Image=rotatedBitmap;
curBmp=rotatedBitmap;
displayImage();
}
catch(NullReferenceException)
{
MessageBox.Show("请先打开一张图片!
","温馨提醒!
");
}
}
//调用函数,实现图片旋转
#ifALLOW_UNSAFE_CODE
privatestaticvoidInternalRotateImage(introtationAngle,BitmaporiginaBitmap,BitmaprotatedBitmap)
{
intnewWidth=rotatedBitmap.Width;
intnewHeight=rotatedBitmap.Height;
intorignalWidth=orignalBitmap.Width;
intorignalHeigth=orignalBitmap.Heigth;
intnewWidthMinusOne=newWidth-1;
intnewHeightMinusOne=newHeight-1;
BitmapDataoriginalData=originalBitmap.LockBits(newRectangle(0,0,originalWidth,originalHeight),ImageLockMode.ReadOnly,PixelFormat32bppRgb);
BitmapDatarotatedData=rotatedBitmap.LockBits(newRectangle(0,0,rotatedBitmap.Width,rotatedBitmap.Height),ImageLockMode.WriteOnly,PixelFormat.Format32bppRgb);
unsafe
{
int*originalPoiner=(int*)orignalData.Scan0.ToPointer();
int*rotatedPointer=(int*)rotatedData.Scan0.ToPointer();
switch(rotationAngle)
{
case90:
for(inty=0;y{
intdestinationX=newWidthMinusOne-y;
for(intx=0;x{
intsourcePosition=(x+y*originalWidth);
intdestinationY=x;
intdestinationPosition=(destinationX+detinationY*nowWidth);
rotatedPointor[destinationPosition]=originalPointor[sourcePosition];
}
}
break;
case270:
for(inty=0;y{
intdestinationX=y;
for(intx=0;x{
intsourcePosition=(x+y*originalWidth);
intdestinat