正文

如何在Java中进行图片剪裁2012-12-14 11:37:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/javaxx/53986.html

分享到:

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


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


输入图像,指定要处理的图像路径


允许用户拖放要剪裁的部分


选择后使用 Robot 类来确定剪裁部分的坐标


剪裁所选图像并保持


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


Listing1: 引入的类


import 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: 入口类


public class CropImage extends JFrame implements MouseListener, MouseMotionListener


{


int drag_status=0,c1,c2,c3,c4;


public static void main(String args[])


{


new CropImage()。start();


}


说明:


编写了一个名为 CropImage 的类


该类扩展了 JFrame 以实现 frame 的所有功能


实现了不同的鼠标事件侦听器以便知道用户什么时候开始拖动鼠标指针


drag_status 变量用于保存鼠标开始拖动时的坐标


我们定义了 main 方法去调用一个 start 方法,这个方法将在下面定义


接下来是 start 方法


Listing 2


public void start()


{


ImagePanel im=new ImagePanel(“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: 鼠标事件处理函数


@Override public void mouseClicked(MouseEvent arg0)


{  }


@Override public void mouseEntered(MouseEvent arg0)


{  }


@Override public void mouseExited(MouseEvent arg0)


{  }


@Override public void mousePressed(MouseEvent arg0)


{


repaint();


c1=arg0.getX();


c2=arg0.getY();


}


@Override public void mouseReleased(MouseEvent arg0) {


repaint();


if(drag_status==1)


{


c3=arg0.getX();


c4=arg0.getY();


try


{


draggedScreen();


}


catch(Exception e)


{


e.printStackTrace();


}


}


}


@Override public void mouseDragged(MouseEvent arg0)


{


repaint();


drag_status=1;


c3=arg0.getX();


c4=arg0.getY();


}


@Override public void mouseMoved(MouseEvent arg0)


{


}


public void paint(Graphics g)


{


super.paint(g);


int w = c1 - c3;


int h = 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 方法


public void draggedScreen()throws Exception  {


int w = c1 - c3;


int h = c2 - c4;


w = w * -1;


h = h * -1;


Robot robot = new Robot();


BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2,w,h));


File save_path=new File(“screen1.jpg”);


ImageIO.write(img, “JPG”, save_path);


System.out.println(“Cropped image saved successfully.”);


}}


说明:


首先计算图像的高度和宽度


使用 Robot 类来对剪裁的区域进行截图并保持到另外一个文件 screen1.jpg


完整的代码


Listing 5: ImagePanel.java


import java.awt.Dimension;


import java.awt.Graphics;


import java.awt.Image;


import javax.swing.ImageIcon;


import javax.swing.JPanel;


class ImagePanel extends JPanel {


private Image img;


public ImagePanel(String img) {


this(new ImageIcon(img)。getImage());


}


public ImagePanel(Image img) {


this.img = img;


Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));


// Dimension size = new Dimension(10,10);


setPreferredSize(size);


setMinimumSize(size);


setMaximumSize(size);


setSize(size);


setLayout(null);


}


public void paintComponent(Graphics g) {


g.drawImage(img, 0, 0, null);


}


} Listing


6:CropImage.java


import 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 extends JFrame implements MouseListener, MouseMotionListener  {


int drag_status=0,c1,c2,c3,c4;


public static void main(String args[])


{


new CropImage()。start();


}


public void start()


{


ImagePanel im=new ImagePanel(“F:\\Wallpaper\\wallpapers\\1.jpg”);


add(im);


setSize(400,400);


setVisible(true);


addMouseListener(this);


addMouseMotionListener( this );


setDefaultCloseOperation(EXIT_ON_CLOSE);


}  public void draggedScreen()throws Exception  {


int w = c1 - c3;


int h = c2 - c4;


w = w * -1;


h = h * -1;


Robot robot = new Robot();


BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2,w,h));


File save_path=new File(“screen1.jpg”);


ImageIO.write(img, “JPG”, save_path);


System.out.println(“Cropped image saved successfully.”);


}  @Override public void mouseClicked(MouseEvent arg0) {


}


@Override public void mouseEntered(MouseEvent arg0) {


}


@Override public void mouseExited(MouseEvent arg0) {


}


@Override public void mousePressed(MouseEvent arg0) {


repaint();


c1=arg0.getX();


c2=arg0.getY();


}


@Override public void mouseReleased(MouseEvent arg0) {


repaint();


if(drag_status==1)


{


c3=arg0.getX();


c4=arg0.getY();


try


{


draggedScreen();


}


catch(Exception e)


{


e.printStackTrace();


}


}


}


@Override public void mouseDragged(MouseEvent arg0) {


repaint();


drag_status=1;


c3=arg0.getX();


c4=arg0.getY();


}


@Override public void mouseMoved(MouseEvent arg0) {


}


public void paint(Graphics g)  {


super.paint(g);


int w = c1 - c3;


int h = c2 - c4;


w = w * -1;


h = h * -1;


if(w<0)


w = w * -1;


g.drawRect(c1, c2, w, h);


}


}

阅读(1412) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册