Java 图像裁剪



http://www.oschina.net/question/12_63302

这是一篇入门级文章,高手请略过。

在这篇文章中我们将学习如何用 Java 对图像进行剪裁并将剪裁出来的部分单独保存到文件中。

我们将通过以下步骤来学习:

    输入图像,指定要处理的图像路径允许用户拖放要剪裁的部分选择后使用 Robot 类来确定剪裁部分的坐标剪裁所选图像并保持

接下来我们开始编码部分。

Listing1: 引入的类

12345678910import java.awt.Graphics;import java.awt.Rectangle;import java.awt.Robot;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;import javax.swing.JFrame;

说明:

    Graphics 类包含绘制矩形的方法我们使用 Rectangle 类作为拖拉的矩形区域以作剪裁Robot 类用于捕获屏幕截图使用鼠标侦听器来获取鼠标的拖拉时间Robot 类使用 BufferedImage 来做图像处理File 类用于打开图像文件ImageIO 类用于将图像写到 png 或者 jpg 图像文件中JFrame 用于显示界面

现在我们编写包含 main 方法的入口类

Listing2: 入口类

1234567public class CropImage extendsJFrameimplementsMouseListener, MouseMotionListener{intdrag_status=0,c1,c2,c3,c4;public static void main(String args[]){newCropImage().start();}

说明:

    编写了一个名为 CropImage 的类该类扩展了 JFrame 以实现 frame 的所有功能实现了不同的鼠标事件侦听器以便知道用户什么时候开始拖动鼠标指针drag_status 变量用于保存鼠标开始拖动时的坐标我们定义了 main 方法去调用一个 start 方法,这个方法将在下面定义

接下来是 start 方法

Listing 2

12345678910public void start(){ImagePanel im=newImagePanel("F:\\Wallpaper\\wallpapers\\1.jpg");add(im);setSize(400,400);setVisible(true);addMouseListener(this);addMouseMotionListener(this); setDefaultCloseOperation(EXIT_ON_CLOSE);}

说明:

    我们定义一个名为 ImagePanel 的类,使用要处理的图像作为参数在 JFrame 中放置这个要显示图片的 ImagePanel,并开始侦听鼠标事件

下面我们定义用于处理鼠标事件的方法

Listing 3: 鼠标事件处理函数

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162@Overridepublic void mouseClicked(MouseEvent arg0) { }@Overridepublic void mouseEntered(MouseEvent arg0) { }@Overridepublic void mouseExited(MouseEvent arg0) {}@Overridepublic void mousePressed(MouseEvent arg0) {repaint();c1=arg0.getX();c2=arg0.getY();}@Overridepublic void mouseReleased(MouseEvent arg0) {repaint();if(drag_status==1){c3=arg0.getX();c4=arg0.getY();try{draggedScreen();}catch(Exception e){e.printStackTrace();}}}@Overridepublic void mouseDragged(MouseEvent arg0) {repaint();drag_status=1;c3=arg0.getX();c4=arg0.getY();}@Overridepublic void mouseMoved(MouseEvent arg0) {}public void paint(Graphics g){super.paint(g);intw = c1 - c3;inth = c2 - c4;w = w * -1;h = h * -1;if(w<0)w = w * -1;g.drawRect(c1, c2, w, h);}

说明:

    当鼠标按下时存储当前坐标到 c1 和 c2当鼠标按下并开始拖动时将拖动状态变量 drag_status 设置为 true到鼠标按键松开时表示图像剪裁区域已经选择完毕,调用 draggedscreen 方法paint 方法用于拖动时候的矩形显示,通过当前坐标和初始记录的坐标来绘制矩形

下面是 draggedscreen 方法的代码

Listing 4: draggedScreen 方法

123456789101112public void draggedScreen()throwsException{intw = c1 - c3;inth = c2 - c4;w = w * -1;h = h * -1;Robot robot =newRobot();BufferedImage img = robot.createScreenCapture(newRectangle(c1, c2,w,h));File save_path=newFile("screen1.jpg");ImageIO.write(img,"JPG", save_path);System.out.println("Cropped image saved successfully.");}}

说明:

    首先计算图像的高度和宽度使用 Robot 类来对剪裁的区域进行截图并保持到另外一个文件 screen1.jpg

完整的代码

Listing 5: ImagePanel.java

12345678910111213141516171819202122232425262728293031import java.awt.Dimension;import java.awt.Graphics;import java.awt.Image;import javax.swing.ImageIcon;import javax.swing.JPanel;classImagePanelextendsJPanel {privateImage img;publicImagePanel(String img) {this(newImageIcon(img).getImage());}publicImagePanel(Image img) {this.img = img;Dimension size =newDimension(img.getWidth(null), img.getHeight(null));// Dimension size = new Dimension(10,10);setPreferredSize(size);setMinimumSize(size);setMaximumSize(size);setSize(size);setLayout(null);}publicvoidpaintComponent(Graphics g) {g.drawImage(img,0,0,null);}}

Listing 6:CropImage.java

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102import java.awt.Graphics;import java.awt.Rectangle;import java.awt.Robot;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;import javax.swing.JFrame;public class CropImage extendsJFrameimplementsMouseListener, MouseMotionListener{intdrag_status=0,c1,c2,c3,c4;public static void main(String args[]){newCropImage().start();}public void start(){ImagePanel im=newImagePanel("F:\\Wallpaper\\wallpapers\\1.jpg");add(im);setSize(400,400);setVisible(true);addMouseListener(this);addMouseMotionListener(this); setDefaultCloseOperation(EXIT_ON_CLOSE);}public void draggedScreen()throwsException{intw = c1 - c3;inth = c2 - c4;w = w * -1;h = h * -1;Robot robot =newRobot();BufferedImage img = robot.createScreenCapture(newRectangle(c1, c2,w,h));File save_path=newFile("screen1.jpg");ImageIO.write(img,"JPG", save_path);System.out.println("Cropped image saved successfully.");}@Overridepublic void mouseClicked(MouseEvent arg0) { }@Overridepublic void mouseEntered(MouseEvent arg0) { }@Overridepublic void mouseExited(MouseEvent arg0) { }@Overridepublic void mousePressed(MouseEvent arg0) {repaint();c1=arg0.getX();c2=arg0.getY();}@Overridepublic void mouseReleased(MouseEvent arg0) {repaint();if(drag_status==1){c3=arg0.getX();c4=arg0.getY();try{draggedScreen();}catch(Exception e){e.printStackTrace();}}}@Overridepublic void mouseDragged(MouseEvent arg0) {repaint();drag_status=1;c3=arg0.getX();c4=arg0.getY();}@Overridepublic void mouseMoved(MouseEvent arg0) {}public void paint(Graphics g){super.paint(g);intw = c1 - c3;inth = c2 - c4;w = w * -1;h = h * -1;if(w<0)w = w * -1;g.drawRect(c1, c2, w, h);}}

也许不是自己该去发挥的地方,还是让自己到最适合自己战斗的方面去吧!勇敢的接受自己的失败,

Java 图像裁剪

相关文章:

你感兴趣的文章:

标签云: