缩略图生成器.docx
《缩略图生成器.docx》由会员分享,可在线阅读,更多相关《缩略图生成器.docx(15页珍藏版)》请在冰豆网上搜索。
![缩略图生成器.docx](https://file1.bdocx.com/fileroot1/2023-5/19/edf832d1-3699-408c-887f-b2def35a4ba1/edf832d1-3699-408c-887f-b2def35a4ba11.gif)
缩略图生成器
课程设计说明书
(2012/2013学年第一学期)
课程名称:
软件程序设计
题目:
缩略图生成器
设计周数:
2周
设计成绩:
2013年1月18日
1课程设计目的
⑴本课程设计是一门软件实践专业基础课,旨在提高学生的软件编程能力进一步加强学生对面向对象程序设计思想的理解,增强对C#程序语言的灵活运用,为以后从事相关行业打下软件编程基础。
⑵通过缩略图生成器的设计,掌握VisualStudio中Windows窗体的建立和相关控件的使用。
2课程设计正文
2.1缩略图生成器介绍
缩略图生成器是一个简单的图片缩小的软件,它可以让用户按照任意比例,或者自定义的高度和宽度来缩小图片,并且不失真,来达到用户的需求。
2.2缩略图生成器软件的功能要求
⑴单张图片生成缩略图和批量图片生成缩略图
⑵自定义缩略图的宽或高,等比例不失真的生成缩略图
⑶生成缩略图文件命名规则定制
⑷生成文件存放路径的自定义
⑸自定义缩略图的宽和高,不失真的生成缩略图,空白部分采用白色填充
2.3缩略图生成器的分析
实现生成缩略图功能不是简单的把图片缩小,在自定义高度宽度的情况下,要保证图片不失真,就需要原图片高宽和指定高度去对比,是太宽,还是太高,然后计算出不失真情况下缩小后的图片大小,在计算图片坐标,来生成缩略图。
在按比例缩小情况下,只需要原图片高宽乘以百分比即可。
2.4缩略图生成器的设计
根据功能要求,按照自己的思路来规划五个模块,一个模块是选择要处理的图片格式,其中包括jpg、png、bmp、wmf、emf、ico。
打开图片有两种方式,可以通过菜单栏,也可以通过选择按钮来实现选择按钮添加到listbox里面。
第二个模块是根据用户的需求来选择缩放的方式,一种是自定义高度和宽度,一种是按照比例。
第三个模块是选择图片以后可以通过图片预览来显示,并加以显示图片的大小,名称和尺寸。
第四个模块是选择保存的路径和重命名用户可根据自己的需要,将缩放后的图片保存在任意位置,重命名若为空则以原图片名称来保存,若不为空则以新名字来命名。
第五个模块是介绍软件功能的。
缩略图的界面简洁明了,可以很方便用户的使用和操作,界面上的菜单栏有选项、帮助,选项里面有打开图片和退出操作,帮助里面有功能介绍和访问浏览器,界面上还有生成缩略图按钮,浏览文件夹按钮,可以很方便用户操作。
缩略图生成器的操作界面如下:
图1软件界面
从界面我们可以很清楚看出软件的使用方法,并且可以看到图片的基本信息和软件基本功能,在界面中使用到的控件有:
表1控件名称
控件名称
控件文本名称
btnSelect
选择图片
listBox1
显示图片名称
pictureBox
显示图片
Label
显示要显示的文字
rbtnCustom
按自定义缩小
rbtnProportion
按比例缩小
txtReName
输入重命名
btnScan
选择保存路径
btnSingle
生成缩略图
progressBar1
显示生成进度
根据对缩略图生成器的分析和设计,可以得出如下流程图:
图2程序流程图
2.5软件程序设计
2.5.1图片选择模块代码
设计中需要做到图片批量处理的功能,进行多选时想实现将图片名称显示在列表控件里面,单击图片名称可以再图片预览区查看基本图片信息,并且可以进行多选,这个功能的代码如下:
privatevoidbtnSelect_Click(objectsender,EventArgse)
{
this.listBox1.Items.Clear();
FolderBrowserDialogfbd=newFolderBrowserDialog();
if(fbd.ShowDialog()==DialogResult.OK)
{
DirectoryInfodir=newDirectoryInfo(fbd.SelectedPath);
foreach(FileInfofilesindir.GetFiles())
{
listBox1.Items.Add(files.Name);
}
}
filepath=fbd.SelectedPath;
}
privatevoidlistBox1_Click(objectsender,EventArgse)
{
stringpath=filepath+"\\"+this.listBox1.SelectedItem.ToString();
FileInfopicInfo=newFileInfo(path);
longpicLong=picInfo.Length/1024;
stringpicName=picInfo.Name;
stringpicDirectoryPath=picInfo.DirectoryName;
try
{
Bitmappic=newBitmap(path);
PointptLoction=newPoint(pic.Size);
if(ptLoction.X>picBox.Size.Width||ptLoction.Y>picBox.Size.Height)
{
picBox.SizeMode=PictureBoxSizeMode.Zoom;
}
else
{
picBox.SizeMode=PictureBoxSizeMode.CenterImage;
}
this.picBox.Image=Image.FromFile(path);
lblName.Text=picName;
lblLength.Text=picLong.ToString()+"KB";
lblSize.Text=pic.Size.Width.ToString()+"×"+pic.Size.Height.ToString();
progressBar1.Value=0;
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
2.5.2实现自定义缩小代码
想实现缩小简单,但是保证不失真需要对指定的高宽和原图片高宽的比进行比较,若原图片相对于指定大小过宽,则指定宽为新图片宽,同时计算出图片高和新图片y坐标,同理,若原图片相对于指定大小过高,则指定高为新图片高,同时计算出图片的宽和新图片x坐标,最后通过画布来绘制新图片,其余部分填充为白色。
程序代码如下:
publicstaticvoidThumbnail(intiWidth,intiHeight,stringinputImgFile,stringoutImgFile)
{
Imageoldimage=Image.FromFile(inputImgFile);
doubleNewWidth;//新的宽度
doubleNewHeight;//新的高度
doubleOldWidth,OldHeight;//原始高宽
intflat=0;//标记图片是不是等比
intxPoint=0;//若果要补白边的话,原图像所在的x,y坐标。
intyPoint=0;
OldWidth=(double)oldimage.Width;
OldHeight=(double)oldimage.Height;
//判断图片
if((OldWidth/OldHeight)>((double)iWidth/(double)iHeight))//当图片太宽的时候
{
NewHeight=OldHeight*((double)iWidth/(double)OldWidth);
NewWidth=(double)iWidth;
yPoint=(int)(((double)iHeight-NewHeight)/2);//此时x坐标不用修改
flat=1;
}
elseif((OldWidth/OldHeight)==((double)iWidth/(double)iHeight))
{
NewWidth=iWidth;
NewHeight=iHeight;
}
else
{
NewWidth=(int)oldimage.Width*((double)iHeight/(double)oldimage.Height);//太高的时候
NewHeight=(double)iHeight;
xPoint=(int)(((double)iWidth-NewWidth)/2);//此时y坐标不用修改
flat=1;
}
//缩小图片
ImagethumbnailImage=oldimage.GetThumbnailImage((int)NewWidth,(int)NewHeight,newImage.GetThumbnailImageAbort(ThumbnailCallback),IntPtr.Zero);
Bitmapbm=newBitmap(thumbnailImage);
if(flat!
=0)
{
BitmapbmOutput=newBitmap(iWidth,iHeight);//创建新图片
Graphicsgc=Graphics.FromImage(bmOutput);//根据新建的Bitmap位图,创建画布
SolidBrushsb=newSolidBrush(Color.White);//定义单色画刷SolidBrush:
画刷最简单的形式,用纯色进行绘制
gc.FillRectangle(sb,0,0,iWidth,iHeight);//填充为白色
gc.DrawImage(bm,xPoint,yPoint,(int)NewWidth,(int)NewHeight);//绘制“源位图”
bmOutput.Save(outImgFile);
}
else
{
bm.Save(outImgFile);
}
}
2.5.3按比例缩小的程序代码
按比例缩小相对来说比较简单,输入的百分比乘以原片的高宽即为缩小后的高宽,再通过GetThumbnailImage方法来得到缩略图,相关程序代码如下:
publicboolThumbnailImage(doublePercent,stringsourceFilePath,stringtargetFilePath)
{
try
{
Imageoldimage=Image.FromFile(sourceFilePath);
intImageWidth=Convert.ToInt32(oldimage.Width*Percent);
intImageHeight=Convert.ToInt32(oldimage.Height*Percent);
ImageReducedImage=oldimage.GetThumbnailImage(ImageWidth,ImageHeight,newImage.GetThumbnailImageAbort(ThumbnailCallback),IntPtr.Zero);
Bitmapbm=newBitmap(ReducedImage);
bm.Save(targetFilePath);
returntrue;
}
catch(Exceptione)
{
MessageBox.Show(e.Message);
returnfalse;
}
}
2.5.4生成缩略图程序代码
做的程序单张生成和批量生成的功能都要一个按钮来控制,所以用到了循环,其中需要判断是否选择图片,是否选择缩放比例,保存路径是否为空,重命名是否为空,并且对这些条件作出相应提示。
程序代码如下:
privatevoidbtnSingle_Click(objectsender,EventArgse)
{
if(listBox1.SelectedItems.Count!
=0)
{
progressBar1.Maximum=listBox1.SelectedItems.Count;
progressBar1.Step=1;
if(rbtnCustom.Checked==true)
{
if(txtPath.Text!
="")
{
try
{
for(inti=0;i{
ReName(this.listBox1.SelectedItems[i].ToString(),i+1);//调用重命名方法
if(saveName=="")
return;
else
{
frmMain.Thumbnail(Convert.ToInt32(txtWidth.Text),Convert.ToInt32(txtHeight.Text),filepath+"\\"+listBox1.SelectedItems[i].ToString(),txtPath.Text+"\\"+saveName);
progressBar1.PerformStep();
}
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
return;
}
MessageBox.Show("图片成功处理,请到相应文件夹查看!
","提示",MessageBoxButtons.OK);
}
else
{
MessageBox.Show("请输入要保存的路径。
","提示",MessageBoxButtons.OK);
}
}
elseif(rbtnProportion.Checked==true)
{
if(txtPath.Text!
="")
{
try
{
for(inti=0;i{
ReName(this.listBox1.SelectedItems[i].ToString(),i+1);//调用重命名方法
if(saveName=="")
return;
else
{
ThumbnailImage(Convert.ToDouble(txtProportion.Text)/100,filepath+"\\"+listBox1.SelectedItems[i].ToString(),txtPath.Text+"\\"+saveName);
progressBar1.PerformStep();
}
}
}
catch(Exceptionex)
{
MessageBox.Show(ex.Message);
return;
}
MessageBox.Show("图片成功处理,请到相应文件夹查看!
","提示",MessageBoxButtons.OK);
}
else
{
MessageBox.Show("请输入要保存的路径。
","提示",MessageBoxButtons.OK);
}
}
else
{
MessageBox.Show("请选择缩放比例。
","提示",MessageBoxButtons.OK);
}
}
else
{
MessageBox.Show("请选择要处理的图片!
","提示",MessageBoxButtons.OK);
}
}
3、软件的调试过程,编程中出现的错误及改正方法
在整个程序分析和代码书写的过程中遇到了不少的问题,使自己对C#有了更深层的了解。
由于是第一次用C#进行软件设计,所以开始有点不知所措。
在查阅了书籍资料和网上相关知识后,才得到了解决。
图片打开的代码是看了书上的例子后写出来的,后来在运用循环来实现批量处理的时候遇到了问题,提示保存路径错误,经过查看资料后才知道原来路径调用的不完整。
在循环里调用重命名方法时候又遇到了问题,想实现单击生成按钮后若重命名为空出现提示功能,但是方法在循环里面,一般调用会每处理一张图片会提示一次,这不仅不适用而且很麻烦,为了解决这个问题,我增加了一个布尔变量,来记忆第一次循环时候单击的是确认还是取消。
这两个问题只是设计过程中的一小部分,其中还有许许多多的小问题。
下面是处理前后的两张图片对比:
处理前:
图3处理前图片
处理后:
图4处理后图片
4、课程设计总结
两周的课程设计中,学到了很多东西。
在C#课程设计中做的学籍管理系统在我的课设任务里并没有起来很大的帮助,缩略图生成器的设计不需要用到数据库,而且其中用到的文件操作控件们也很陌生,开始感到很难,无从下手,在实践过程中慢慢摸索,找来相关书籍来查看相关控件的具体属性,方法和一些实例来加深印象,经过同学和老师的帮助完成了缩略图的设计。
两周的时间里整天面对代码确实很枯燥,但是作出一些成果后才觉得有了写乐趣,但实际的设计过程中遇到了很多问题,开始的显示图片问题使自己困扰了很久,经过长时间调试后才找到了问题的所在,等到了对图片的导出时,又出现了问题,导出的图片总是对PictureBox1进行处理,由于自己对图片的路径设置错误,应该是对原图片进行处理。
在改定后,程序运行正确,但图片的导出还是存在问题。
经过仔细的查看后,发现自己犯了同样的错误,纠正之后才知道书写程序要仔细认真。
在调试程序的过程中,让我认识到了理论和实践还是有很大差距的,即使软件设计成功,代码写正确后测试时候也不一定能达到预想的结果。
这让我知道了设计程序不只是写代码那么简单,还要考虑逻辑上的关系。
这次缩略图生成器的设计中,我不仅巩固了之前学过的理论知识,同时也学会了团队合作的意义,要做好一个项目一个人的能力是有限的,但是在整体组的面前就不会那么困难了。
大家可以一起思考一起想解决的办法,这样就可以有不同的思路,不仅增长了我们的见识同时也激发了我们学习的积极性,我们在讨论过程中通过查找资料,互相讨论,或者请教老师,不仅对只是有了更深的认识,同时也锻炼了我们交际能力,是自己的综合实力更好。
5、参考文献
[1]邱锦伦,曹旻.VisualC#.NET程序设计教程.清华大学出版社,2006.9
[2]KarliWatson,ChristianNagel.C#入门经典(第5版).清华大学出版社,2010.10
[3]王小科,王军,赵会东.C#编程宝典(十年经典版).人民邮电出版社,2011.1
[4]马骏.C#网络应用高级编程.人民邮电出版社,2006
课程设计
评语
课程设计
成绩
指导教师
(签字)
年月日