图片查看器.docx
- 文档编号:9387013
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:27
- 大小:401.61KB
图片查看器.docx
《图片查看器.docx》由会员分享,可在线阅读,更多相关《图片查看器.docx(27页珍藏版)》请在冰豆网上搜索。
图片查看器
Java程序设计
学期作业项目报告
题目图片查看器
姓名薛晓欣
学号2013041269
年级2013级2班
系别物联网
学院计算机信息与工程学院
指导教师李红宇
学期2014~2015学年第二学期
2015年07月1日
图片查看器
1设计内容
本次设计的图片查看器实现了在用户选定的文件目录下循环浏览指定后缀的图片文件,并且可以对选择的图片进行放大,缩小,左旋,右旋,另存,彻底删除等操作。
2设计要求
随着数字产品渐进人们的生活,网络通信技术、图像处理技术以及多媒体技术的发展,越来越多的用户希望能够对已有的数字图片进行查看并能够实现简单的操作。
本图片查看器以其简洁明了易操作的特点实现图片查看的基本功能,从而也就满足了用户的基本要求。
3总体设计
(1)系统功能分析
本系统要用到以下的Java编程技术实现的功能:
图像显示功能:
客户需要显示图片,这将由图像显示功能来完成。
显示图片的时候,用到了双缓冲技术来消除闪烁问题。
(2)类图
系统中用到了一些基本类、实现了一些接口。
系统所用到的类如图1所示:
图1系统类图
4详细设计
1)程序中引用的类
①JPanel类
程序中定义了三个Jpanel类分别是:
pathBar,picContainer,ctrBar。
用于图片查看器的整体布局。
其中pathBar为顶部路径栏,picContainer为图片显示区域,ctrBar为底部控制栏。
②JLabel类
程序中定义了类名为pathInfo的JLabel类,用于实现顶部路径栏,底部控制栏按钮的文字显示。
③JButton类
程序中定义了多个JButton类:
openbtn,prebtn,nextbtn,zoominbtn,zoomoutbtn,oripicbtn,angleleftbtn,anglerightbtn,exitbtn,deletebtn,sav;为查看器的按钮。
④Image类
程序中定义了名为pic的Image类用于对被查看的图片的操作。
⑤BufferedImage类
此类为用于显示的缓冲区图像。
在对图像进行操作前,都先将图片读进预设的缓冲区,然后再显示在用户前端,这样虽然速度慢了点,但很好的消除了图片闪烁效果。
⑥Graphics2D类
此类与上面的BufferedImage类共同作用,通过运用双缓冲技术很好的消除屏闪问题。
⑦String类
程序中运用了三个不同的String类,从而实现了需要查看的图片的路径的操作,并且在启动图片查看器时,图片的路径能够在路径栏显示出来。
同时还设置了String数组用于存储用户选定的目录下所有指定格式的图片,这样可以实现循环浏览图片等操作。
(2)程序的构造方法及其实现
因为图片查看器可以实现对图片不同的操作,程序中构造了十多个方法以达到其目的。
各构造方法相互联系共同完成图片查看器的各项功能。
各个方法描述如下:
①publicvoidinit()
本方法实现了对图片查看器的界面的整体布局及按钮的初始化。
对页面的总体布局采用了以下主要代码进行实现:
setLayout(newBorderLayout());add(pathBar,BorderLayout.NORTH);add(picContainer,BorderLayout.CENTER);add(ctrBar,BorderLayout.SOUTH);resize(640,400);设置顶部路径栏,及其文字显示;代码如pathBar=newJPanel();pathBar.setLayout(newBorderLayout());pathInfo.setText("图片查看器");pathBar.add(pathInfo);同时对图片显示区域,底部的控制栏的设置也运用了相似的代码进行实现,在此就不再重复。
各按钮除了“打开”一按钮外,其他的各按钮均设置为false。
这是因为只有“打开”图片后才能进行以下的像循环浏览,旋转,删除等操作。
具体方法的实现见附件。
②publicvoidactionPerformed(ActionEvent)
在本方法中主要实现了用户对底部控制栏各按钮的点击后,图片查看器进行的相对应的操作反应。
方法中一开始用JButtonclick=(JButton)e.getSource();获取按键源,然后根据click与程序设定的已知的类进行比较决定进行相应的反应。
if(click==openbtn);if(click==prebtn&&pic!
=null);等一系列进行判断后,进行或是打开文件open()方法的调用;或是pre()方法的调用;其他各操作也大同小异,在此就不再赘述。
方法的详细代码见附件。
③publicvoidopen()
该方法实现了对用户选定的文件路径下的后缀为.jpg的图片文件的打开操作。
同时能够对该路径下的一切符合条件的文件进行跟踪处理。
方法中的核心在于一个过滤操作:
FileNameExtensionFilterfilter=newFileNameExtensionFilter("*.JPG","jpg");这样就能实现.jpg文件的浏览了。
在选定了图片后,相应的按钮值应该被赋值为ture,以便进行其他的操作。
若没有选定图片则显示“没有选择图片”。
④publicvoidsave()throwsIOException
该方法是为了满足用户希望对图片进行另外存储的操作,通过用户自己的选择重新选定图片的存储路径。
详细实现见附件中代码。
⑤publicvoidpre()及publicvoidnext()
Pre与next方法实现了对当前图片的上一张下一张的浏览。
因为在第一次打开文件时就将该路径下所有符合要求的图片存储在String[]pics中。
通过if(i==0){i=pics.length-1;}else{i--;}其中i为当前的图片位置数。
通过dir=path+"\\"+pics[i];获得文件的路径,然后调用loadImage(dir);此方法将在后面介绍;与上面的方法相对应的是此方法实现了对当前图片下一张的浏览,实现原理与上相同,if(i==pics.length-1){i=0;}else{i++;}通过调用loadImage(dir);一方法实现。
⑥publicvoidpicTrans()
如果bufImage为空则直接返回,之后进行过滤图像操作,2D仿射变换,设置仿射变换的比例因子transform.setToScale(scaleX,scaleY);创建仿射变换操作对象,过滤图像,将目标图像存在filteredBufImage中,然后显示。
⑦publicvoidzoomin()
此方法实现了对当前的图片进行按设置比例缩小操作。
在进行缩小操作前,先对图片的大小进行判断,看是否已经缩小到最小,若最小则显示提示信息“已经缩至最小!
”;否则进行缩小操作。
在此过程中调用了picTrans()方法,以及repaint();重绘组件的方法。
⑧publicvoidoripic()及publicvoiddelete()
方法实现了将放大或缩小后的图片大小还原的操作。
同时也调用了picTrans()方法,以及repaint();重绘组件的方法。
具体的picTrans()方法将在下面详细描述。
此方法具体实现见附件;publicvoiddelete()方法将图片彻底删除,删除后图片彻底被粉碎,回收站里面都不能找到。
因此要慎用此按钮。
⑨publicvoidangleleft()及publicvoidangleright()
方法每次对图片进行45°的向左向右的旋转操作。
radius+=-Math.PI/2;用以控制,而这些操作后,每次都应oripicbtn.setEnabled(true),也就是要将还原按钮赋值为真。
⑩publicvoidloadImage(StringfileName)及publicvoidexit()
前一个方法通过增加图像到加载器中,创建原始缓冲区图像,创建bufImage的图形环境:
bufImageG=bufImage.createGraphics();传输源图像数据到缓冲区图像中一些列的操作,对图片进行了加载操作;publicvoidexit()方法是退出查看器的方法。
关键代码:
importjava.awt.*;
importjava.awt.event.*;
importjava.awt.geom.*;
importjava.awt.image.*;
importjavax.swing.*;
importjavax.swing.filechooser.*;
importjava.io.*;
importjava.applet.*;
publicclassPicViewerextendsAppletimplementsActionListener{
JPanelpathBar,picContainer,ctrBar;
JLabelpathInfo;
JButtonopenbtn,prebtn,nextbtn,zoominbtn,zoomoutbtn,oripicbtn,angleleftbtn,
anglerightbtn,exitbtn,deletebtn,savebtn;
Imagepic;//查看的图片
BufferedImagebufImage;//用于显示的缓冲区图像
BufferedImageoriBufImage;//原始缓冲区图像
Graphics2DbufImageG;//缓冲区图像的图形环境
Stringpath,filename,dir;//需要查看图片的路径
String[]pics;//目录下所有指定格式的图片
intpicWidth,picHeight;//图片大小
inti=0;
finaldoubleZOOM_PERCENT=0.15;//每次放大和缩小的倍率
finalStringFILE_TYPE=".jpg";
booleanhasPic,isangled;
doublescaleX;//图像水平方向的缩放因子
doublescaleY;//图像竖直方向的缩放因子
doubleradius;//旋转角度
FilterfilterJpg;
publicvoidinit(){
//顶部路径栏
pathBar=newJPanel();
pathBar.setLayout(newBorderLayout());
pathInfo=newJLabel();
pathInfo.setText("图片查看器");
pathBar.add(pathInfo);
//图片显示区域
picContainer=newJPanel();
picContainer.setBackground(Color.LIGHT_GRAY);
//底部控制栏
ctrBar=newJPanel();
openbtn=newJButton("打开");
openbtn.addActionListener(this);
savebtn=newJButton("保存");
savebtn.addActionListener(this);
prebtn=newJButton("上一幅");
prebtn.addActionListener(this);
nextbtn=newJButton("下一幅");
nextbtn.addActionListener(this);
zoominbtn=newJButton("放大");
zoominbtn.addActionListener(this);
zoomoutbtn=newJButton("缩小");
zoomoutbtn.addActionListener(this);
oripicbtn=newJButton("原始");
oripicbtn.addActionListener(this);
angleleftbtn=newJButton("左旋");
angleleftbtn.addActionListener(this);
anglerightbtn=newJButton("右旋");
anglerightbtn.addActionListener(this);
deletebtn=newJButton("删除");
deletebtn.addActionListener(this);
exitbtn=newJButton("退出");
exitbtn.addActionListener(this);
ctrBar.add(openbtn);
ctrBar.add(zoominbtn);
ctrBar.add(zoomoutbtn);
ctrBar.add(oripicbtn);
ctrBar.add(prebtn);
ctrBar.add(nextbtn);
ctrBar.add(angleleftbtn);
ctrBar.add(anglerightbtn);
ctrBar.add(deletebtn);
ctrBar.add(savebtn);
ctrBar.add(exitbtn);
//界面总布局
setLayout(newBorderLayout());
add(pathBar,BorderLayout.NORTH);
add(picContainer,BorderLayout.CENTER);
add(ctrBar,BorderLayout.SOUTH);
resize(640,480);
scaleX=1.0;
scaleY=1.0;
radius=0.0;
hasPic=false;
isangled=false;
dir="";
prebtn.setEnabled(false);
nextbtn.setEnabled(false);
zoominbtn.setEnabled(false);
zoomoutbtn.setEnabled(false);
angleleftbtn.setEnabled(false);
anglerightbtn.setEnabled(false);
oripicbtn.setEnabled(false);
deletebtn.setEnabled(false);
savebtn.setEnabled(false);
}
publicvoidactionPerformed(ActionEvente){
JButtonclick=(JButton)e.getSource();//获取按键源
if(click==openbtn){
open();
}
if(click==prebtn&&pic!
=null){
pre();
}
if(click==nextbtn&&pic!
=null){
next();
}
if(click==zoominbtn&&pic!
=null){
pathInfo.setForeground(Color.BLACK);
pathInfo.setText("放大图片...");
zoomin();
}
if(click==zoomoutbtn&&pic!
=null){
pathInfo.setForeground(Color.BLACK);
pathInfo.setText("缩小图片...");
zoomout();
}
if(click==oripicbtn&&pic!
=null){
oripic();
}
if(click==angleleftbtn&&pic!
=null){
angleleft();
}
if(click==anglerightbtn&&pic!
=null){
angleright();
}
if(click==exitbtn){
exit();
}
if(click==deletebtn&&pic!
=null)
{
pathInfo.setForeground(Color.BLACK);
pathInfo.setText("删除图片");
delete();
}
if(click==savebtn&&pic!
=null)
{
pathInfo.setForeground(Color.BLACK);
pathInfo.setText("复制图片");
try
{
save();
}catch(Exceptionee)
{}
}
}
//line1,打开需要查看的图片文件
publicvoidopen(){
JButtonmsg=newJButton();
JFileChooserchooser=newJFileChooser();
//只显示文件夹和jpg格式的文件
FileNameExtensionFilterfilter=newFileNameExtensionFilter("*.JPG","jpg");//建立过滤器,只显示jpg
chooser.setFileFilter(filter);
chooser.setCurrentDirectory(newFile(""));
intreturnVal=chooser.showOpenDialog(msg);
//根据返回值判断是否选择了文件
if(returnVal==JFileChooser.APPROVE_OPTION){
//获取文件名
filename=chooser.getSelectedFile().getName();
//获取文件路径
path=chooser.getCurrentDirectory().getPath();
//获取文件路径下所有jpg文件
filterJpg=newFilter(FILE_TYPE);
Filefile=newFile(path);
pics=file.list();
pics=file.list(filterJpg);
//跟踪选中的图片
for(intj=0;j if(pics[j].equalsIgnoreCase(filename)) { i=j; break; } dir=path+"\\"+filename; hasPic=true; loadImage(dir); pathInfo.setForeground(Color.BLACK); pathInfo.setText(path+"\\"+filename); prebtn.setEnabled(true); nextbtn.setEnabled(true); zoominbtn.setEnabled(true); zoomoutbtn.setEnabled(true); angleleftbtn.setEnabled(true); anglerightbtn.setEnabled(true); deletebtn.setEnabled(true); savebtn.setEnabled(true); }else{ hasPic=false; pathInfo.setForeground(Color.RED); pathInfo.setText("没有选择文件! "); } } //保存文件 publicvoidsave()throwsIOException{ JButtonmsgsave=newJButton(); JFileChooserchooser=newJFileChooser(); //只显示文件夹和jpg格式的文件 FileNameExtensionFilterfilter=newFileNameExtensionFilter( "*.JPG","jpg");//建立过滤器,只显示jpg chooser.setFileFilter(filter); Filefin=newFile(path+"\\"+pics[i]); Filef=newFile(""+"\\"+pics[i]); chooser.setSelectedFile(f); intreturnVal=chooser.showSaveDialog(msgsave); //根据返回值判断是否选择了文件路径 if(returnVal==JFileChooser.APPROVE_OPTION){ //获取文件路径 path=chooser.getCurrentDirectory().getPath(); Filefileout=newFile(path+"\\"+chooser.getSelectedFile().getName()); FileInputStreamisr=newFileInputStream(fin); FileOutputStreamfout=newFileOutputStream(fileout); byteb[]=newbyte[200]; intcount=0; while((count=isr.read(b,0,200))! =-1) fout.write(b,0,count); isr.close(); fout.flush(); fout.close();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图片 查看