1、 成绩: JAVA编程B实验报告实验七: 基于JAVA的 图像处理软件 实验时间:2012年 6月10 日星期日JAVA编程B实验报告一、实验名称Java编程B综合性实验二、实验目的1、掌握J2SE应用程序的设计。2、掌握抽象窗口工具包AWT的使用。3、掌握应用程序用户界面的开发工具包SWING的使用三、实验平台操作系统: Windows 7JDK:JDK 1.7IDE:Eclipse 3.5四、 结构框图打开程序打开文件变形图像灰度处理旋转缩放 扭曲扭曲展宽拉伸直方灰度27018090度放大缩小五、实验内容1、抽象窗口工具包(Abstract Window Toolkit,AWT)简介功能:
2、包含用于创建用户界面和绘制图形图像的所有类。 描述:包含用于创建用户界面和绘制图形图像的所有类。在AWT术语中,诸如按钮或滚动条之类的用户界面对象称为组件。Component 类是所有AWT组件的根。有关所有AWT组件的公共属性的详细描述,请参见 Component。 当用户与组件交互时,一些组件会激发事件。AWTEvent 类及其子类用于表示AWT组件能够激发的事件。有关AWT事件模型的描述,请参见 AWTEvent。 容器是一个可以包含组件和其他容器的组件。容器还可以具有布局管理器,用来控制容器中组件的可视化布局。AWT 包带有几个布局管理器类和一个接口,此接口可用于构建自己的布局管理器2
3、、用户界面的开发工具包Swing简介Swing是一个用于开发Java应用程序用户界面的开发工具包,以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。创建图形界面步骤:(1)导入Swing包;(2)选择界面风格;(3)设置顶层容器;(4)设置按钮和标签;(5)将组件放到容器上;(6)为组件增加边框;(7)处理事件;(8)辅助技术支持。导入Swing包下面语句导入Swing包import javax.swing.*; 大部分Swing程序用到了AWT的基础底层结构和事件
4、模型,因此需要导入两个包:import java.awt.*;import java.awt.event.*; 如果图形界面中包括了事件处理,那么还需要导入事件处理包:import javax.swing.event.*; 选择界面风格Swing允许选择程序的图形界面风格常用的有java风格,windows风格等。下面的代码用于选择图形界面风格,这里选择的是跨平台的Java界面风格。try UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName( ); catch (Exception e) 设置顶层容器
5、图形界面至少要有一个顶级Swing容器,顶级Swing容器为其它Swing组件在屏幕上的绘制和处理事件提供支持。常用的顶级容器:JFrame(框架):表示主程序窗口JDialog(对话框):每个JDialog对象表示一个对话框,对话框属于二级窗口JApplet(小程序):在浏览器内显示一个小程序界面一个框架包括边界、菜单栏、工具栏、状态栏,以及中间占主要部分的窗格。窗格也可以看作是一种面板,但它是框架的一个组成部分;组件不会直接放到框架上,而是放在若干个面板上,这些面板再放到窗格上。用框架对象的getContentPane()函数来获得窗格,再调用窗格的add()函数放置面板。public s
6、tatic void main(String args)JFrame frame=new JFrame(SwingApplication); JPanel panel1=new JPanel(); frame.getContentPane().add(panel1,BorderLayout.CENTER); ./ 添加其他组件frame.pack();frame.setVisible(true); 模式使用关键是java.awt.*里面的两个与显示设备有关的类:GraphicsEnvironment和GraphicsDevice。GraphicsEnvironment为Java应用程序提供了特
7、定平台的 GraphicsDevice对象和 Font 对象集合。这些GraphicsDevice可以是各种本机和远端机器的资源,如屏幕、打印机或者是Image Buffer,甚至是Graphics2D绘图方法的目标对象。而GraphicsDevice就是指特定的图形环境了,如屏幕和打印设备等。这样,我们就可以用GraphicsDevice来操纵屏幕了。GraphicsDevice提供的setFullScreenWindow()方法就是设置全屏幕用的。事件处理监听器:ActionListener 方 法:actionPerformed 事 件:ActionEvent String getAct
8、ionCommand() actioncommand是控件内部的一个字符串,用于标识控件的状态。 此函数可以取得控件的状态,从而决定到底该做什么。 int getModifiers() 取得“产生此事件时,用户同时按下的组合键” long getWhen() 取得“产生此事件时的时间戳” 事件产生原因:点击按钮,在列表框中选择内容,在文本框中点回车,计时器到期 监听器:AdjustmentListener 方 法:adjustmentValueChanged 事 件:AdjustmentEvent Adjustable getAdjustable() adjustable是一个接口,各种滚动条
9、都实现了这个接口。 int getAdjustmentType()取得滚动类型,共有UNIT_INCREMENT,UNIT_DECREMENT,BLOCK_INCREMENT,BLOCK_DECREMENT,TRACK共5种类型 int getValue()取得滚动滑块的当前值事件产生原因:滚动条的滚动 监听器:ItemListener 方 法:itemStateChanged 事 件:ItemEvent Objedt getItem() 取得被选中的元素。注意,返回值是Object,还应该进行强制类型转换。 ItemSelectable getItemSelectable() ItemSel
10、ectable是一个接口,代表那些包含了n个可供选择的子元素的对象。此方法返回产生此事件的对象。此方法的作用主要在于,如果一个列表框是允许多选的,那么上面的方法就不好用了,应该用此方法得到列表对象,再取得被选中的多个元素。 int getStateChange() 取得选择的状态,是SELECTED还是DESELECTED 事件产生原因:各种按钮的点击,列表框的选择 监听器:FocusListener 方 法:focusGained、focusLost 事 件:FocusEvent Component getOppositeComponent() 得到“参与焦点变换的”另一个对象。如果是焦点取
11、得事件,则返回之前拥有焦点的对象;如果是焦点失去事件,则返回得到焦点的对象。若焦点转移到另外一个应用程序,返回null boolean isTemporary() 焦点是临时性转移还是永久转移。临时性转移:用鼠标拖动窗口或者窗口变为非激活状态。其他为永久性转移。事件产生原因:各种组件的焦点变化监听器:KeyListener方 法:keyPressed、keyReleased、keyTyped 事 件:KeyEvent char getKeyChar() 此方法只在keytyped中有效,返回按下的字符。比如按下shift+a,返回A int getKeyCode() 取得键盘上按键的整数编码。
12、请注意,是键盘上的按键,比如F1,Ctrl,Home键等等,都有相应编码。不支持组合键,也就是说“Shift+a”和“a”返回同样的内容,都是小写a的ASCII码。但是大键盘的数字键和小键盘的数字键返回内容不同。 static String getKeyModifiersText(int modifiers) 将掩码转化为字符串,比如“Ctrl”,“Ctrl+Shift”等。注意它是static方法 static String getKeyText(int keyCode)返回keyCode代表的按钮的名字,比如Home,F1等。注意它是statci方法事件产生原因:在各种组件上敲击键盘监听器
13、:MouseListener方 法:mouseClicked、mousePressed、mouseReleased mouseEntered、mouseExited 事 件:MouseEvent Point getLocationOnScreen()返回鼠标相对于显示屏幕的绝对坐标(Java1.6版提供) int getXOnScreen()返回鼠标相对于显示屏幕的X的绝对坐标(java 1.6版提供) int getYOnScreen() 返回鼠标相对于显示屏幕的Y的绝对坐标(java 1.6版提供) Point getPoint()返回鼠标相对于组件的绝对坐标 int getX()返回鼠标
14、相对于组件的X的绝对坐标 int getY()返回鼠标相对于组件的Y的绝对坐标 void translatePoint(int x, int y)给鼠标的做用点加上一个偏移量。比如2个参数分别是10, 20,你要用鼠标画直线,当你鼠标指向100,100开始画,实际上的线是画在110,120处 int getClickCount() 产生此事件时鼠标共点击了多少下(单击、双击、三击) int getButton() 产生此事件时,鼠标的哪个键被点击了:NOBUTTON, BUTTON1, BUTTON2 或者 BUTTON3 boolean isPopupTrigger() 是否能够触发一个弹出
15、式菜单。由于各平台触发弹出式菜单的情况不一样,因此应该在mousePressed 和 mouseReleased中都检测一下 事件产生原因:在任何组件上点击鼠标、将光标移动进来或出去 监听器:MouseMotionListener 方 法:mouseDragged、mouseMoved 事 件:MouseEvent 事件产生原因:在任何组件上移动鼠标 监听器:MouseWheelListener 方 法:mouseWheelMoved 事 件:MouseWheelEvent int getScrollType() 滚动的类型,是按块滚动WHEEL_BLOCK_SCROLL还是按单位滚动WHEE
16、L_UNIT_SCROLL int getScrollAmount() 返回为相应此事件应该滚动的单位数。此方法有效的前提是按单位滚动。 int getWheelRotation() 鼠标滚轮滚动过程中”咔嚓“声的数目。向上滚为负值,向下滚为正值 事件产生原因:在任何组件上滚动鼠标中键 监听器:WindowListener 方 法:windowOpened、windowClosing、windowClosed、windowIconified windowDeiconified、windowActivated、windowDeactivated 事 件:WindowEvent Window ge
17、tWindow() 返回发生此事件的window对象 Window getOppositeWindow() 若发生了焦点转移,返回另一个参与此事件的window对象,或者null int getOldState() 窗口变化前的状态:NORMAL、ICONIFIED、MAXIMIZED_BOTH int getNewState() 窗口变化后的状态 事件产生原因:窗口发生变化 监听器:WindowFocusListener 方 法:windowGainedFocus、windowLostFocus 事 件:WindowEvent 事件产生原因:窗口得到或失去焦点 监听器:Windowstate
18、Listener 方 法:WindowstateChanged 事 件:WindowEvent 事件产生原因:窗口状态改变四、 代码分析package imust.imageprocessing;import java.awt.*;import java.awt.event.*;import java.awt.image.*;import java.io.File;import java.io.FileFilter;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.*;public class
19、ImageProcessing extends JFrame String filepath=; String filename=; File file2; BufferedImage buffimg=null; ImageIcon ic; Image ia,l; JLabel jLabel1=null; BorderLayout borderLayout1=new BorderLayout(); JMenuBar jmb=new JMenuBar(); JMenu file,edit,view,suofang,gray,see,save,move,niuqu; public ImagePro
20、cessing(String title) super(title); file=new JMenu(文件); JMenuItem dakai=new JMenuItem(打开); dakai.addActionListener(new dakai_actionAdapter(this); file.add(dakai); file.addSeparator(); JMenuItem tuichu=new JMenuItem(退出); tuichu.addActionListener(new tuichu_actionAdapter(this); file.add(tuichu); jmb.a
21、dd(file); suofang=new JMenu(缩放); JMenuItem suoxiao=new JMenuItem(缩小); suoxiao.addActionListener(new testImage_suoxiao_actionAdapter(this); this.getContentPane().setLayout(borderLayout1); suofang.add(suoxiao); suofang.addSeparator(); JMenuItem fangda=new JMenuItem(放大); fangda.addActionListener(new te
22、stImage_fangda_actionAdapter(this); suofang.add(fangda); jmb.add(suofang); edit=new JMenu(旋转); JMenuItem xuanzhuan90=new JMenuItem(旋转90度); xuanzhuan90.addActionListener(new xuanzhuan90_actionAdapter(this); edit.add(xuanzhuan90); edit.addSeparator(); JMenuItem xuanzhuan180=new JMenuItem(旋转180度); xuan
23、zhuan180.addActionListener(new xuanzhuan180_actionAdapter(this); edit.add(xuanzhuan180); edit.addSeparator(); JMenuItem xuanzhuan270=new JMenuItem(旋转270度); xuanzhuan270.addActionListener(new xuanzhuan270_actionAdapter(this); edit.add(xuanzhuan270); jmb.add(edit); gray=new JMenu(图像灰度处理); JMenuItem hu
24、idu=new JMenuItem(灰度变换); huidu.addActionListener(new huidu_actionAdapter(this); gray.add(huidu); gray.addSeparator(); JMenuItem junhenghua=new JMenuItem(直方图均衡化); junhenghua.addActionListener(new junhenghua_actionAdapter(this); gray.add(junhenghua); jmb.add(gray); /zyf/ see=new JMenu(变形); JMenuItem l
25、ashen=new JMenuItem(拉伸); lashen.addActionListener(new testImage_lashen_actionAdapter(this); see.add(lashen); see.addSeparator(); JMenuItem zhankuan=new JMenuItem(展宽); zhankuan.addActionListener(new testImage_zhankuan_actionAdapter(this); see.add(zhankuan); see.addSeparator(); jmb.add(see); niuqu=new
26、 JMenu(扭曲); JMenuItem niuqu1=new JMenuItem(扭曲); niuqu1.addActionListener(new testImage_niuqu1_actionAdapter(this); niuqu.add(niuqu1); niuqu.addSeparator(); jmb.add(niuqu); save=new JMenu(保存); JMenuItem saveas=new JMenuItem(另存为); saveas.addActionListener(new saveas_actionAdapter(this); save.add(savea
27、s); save.addSeparator(); jmb.add(save); move=new JMenu(移动); JMenuItem lmove=new JMenuItem(向左移动); lmove.addActionListener(new testImage_lmove_actionAdapter(this); move.add(lmove); move.addSeparator(); JMenuItem rmove=new JMenuItem(向右移动); rmove.addActionListener(new saveas_actionAdapter(this); move.ad
28、d(rmove); move.addSeparator(); jmb.add(move); /zyf/ view=new JMenu(关于); JMenuItem banben=new JMenuItem(版本说明); banben.addActionListener(new banben_actionAdapter(this); view.add(banben); jmb.add(view); /zyf this.setSize(800,600); this.setJMenuBar(jmb); jLabel1=new JLabel(,JLabel.CENTER); JScrollPane p
29、ane = new JScrollPane(jLabel1); this.add(pane,borderLayout1.CENTER); this.setVisible(true); public static void main(String args) ImageProcessing testImage1=new ImageProcessing(基于J2SE的数字图像处理软件); testImage1.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0);
30、); /通过文件选择对话框打开图片并显示 void dakai_actionPerformed(ActionEvent e) JFileChooser chooser =new JFileChooser(); if(JFileChooser.APPROVE_OPTION=chooser.showOpenDialog(this) String strSelectedPath=chooser.getSelectedFile().getPath(); File file3=chooser.getSelectedFile(); try buffimg = ImageIO.read(file3); ca
31、tch (IOException a) a.printStackTrace(); filename=chooser.getSelectedFile().getName(); String cat = filename.substring(filename.lastIndexOf(.) + 1).toUpperCase(); if(cat.equalsIgnoreCase(JPG)|cat.equalsIgnoreCase(GIF)|cat.equalsIgnoreCase(PNG)|cat.equalsIgnoreCase(JPEG) filepath=strSelectedPath; ic=
32、new ImageIcon(filepath); ia=ic.getImage(); int height=ic.getIconHeight(); int width=ic.getIconWidth(); jLabel1.setSize(width,height); jLabel1.setIcon(ic); repaint(); else JOptionPane.showMessageDialog(null,该软件只支持JPG、GIF、PNG格式的图像文件 ,提示,JOptionPane.INFORMATION_MESSAGE); /执行拉伸操作 void lashen_actionPerfo
33、rmed(ActionEvent e) String beishu=JOptionPane.showInputDialog(拉伸几倍长?); int s=Integer.parseInt(beishu);Image ia=ic.getImage(); int height=ic.getIconHeight();int width=ic.getIconWidth();/598 Image ib=ia.getScaledInstance(width/1,height*s,Image.SCALE_DEFAULT); ImageIcon ica=new ImageIcon(ib); jLabel1.s
34、etIcon(ica); repaint(); /执行展宽操作void zhankuan_actionPerformed(ActionEvent e) String beishu=JOptionPane.showInputDialog(拉伸几倍宽?); int s=Integer.parseInt(beishu);Image ia=ic.getImage(); int height=ic.getIconHeight();int width=ic.getIconWidth();/598 Image ib=ia.getScaledInstance(width*s,height/1,Image.SC
35、ALE_DEFAULT); ImageIcon ica=new ImageIcon(ib); jLabel1.setIcon(ica); repaint(); /执行缩放操作 void suoxiao_actionPerformed(ActionEvent e) String beishu=JOptionPane.showInputDialog(输入缩小倍数); int s=Integer.parseInt(beishu); Image ia=ic.getImage(); int height=ic.getIconHeight(); int width=ic.getIconWidth();/5
36、98 Image ib=ia.getScaledInstance(width/s,height/s,Image.SCALE_DEFAULT); ImageIcon ica=new ImageIcon(ib); jLabel1.setIcon(ica); repaint(); /放大操作 void fangda_actionPerformed(ActionEvent e) String beishu=JOptionPane.showInputDialog(输入放大倍数); System.out.println(beishu); int s=Integer.parseInt(beishu); Sy
37、stem.out.println(s); Image ia=ic.getImage(); int height=ic.getIconHeight(); int width=ic.getIconWidth(); Image ib=ia.getScaledInstance(width*s,height*s,Image.SCALE_DEFAULT); ImageIcon ica=new ImageIcon(ib); jLabel1.setIcon(ica); repaint(); /退出操作 void tuichu_actionPerformed(ActionEvent e) System.exit
38、(0); /zyf/向左移动 void niuqu1_actionPerformed(ActionEvent e) try Image ia=ic.getImage(); int width = ia.getWidth(this);int height = ia.getHeight(this);int pixels = new int width * height;PixelGrabber pg = new PixelGrabber(ia, 0, 0, width, height, pixels, 0, width);if (pg.grabPixels() & (pg.status()& Im
39、ageObserver.ALLBITS) !=0) l = createImage(new MemoryImageSource(height,width, rowFlipPixels1(rot90Pixels(pixels, width, height), width, height), 0,height); catch (InterruptedException e1) e1.printStackTrace(); ImageIcon ica=new ImageIcon(l); jLabel1.setIcon(ica); repaint(); /zyf /顺时针旋转90度操作void xuanzhuan90_actionPerformed(ActionEvent e) try Image ia=ic.getImage(); int width = ia.getWidth(this);int height = ia