龙都娱乐»Java WEB»如何在 Java 中进行图片剪裁

如何在 Java 中进行图片剪裁

来源:oschina 发布时间:2014-12-30 阅读次数:
  这是一篇入门级文章,高手请略过。   在这篇文章中我们将学习如何用 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); } }   全文完!   英文原文:http://mrbool.com/how-to-crop-an-image-using-java/25272
    QQ群:WEB龙都娱乐官方群(515171538),验证消息:10000
    微信群:加小编微信 849023636 邀请您加入,验证消息:10000
    提示:更多精彩内容关注微信公众号:全栈龙都娱乐中心(fsder-com)
    网友评论(共1条评论) 正在载入评论......
    理智评论文明上网,拒绝恶意谩骂 发表评论 / 共1条评论
    登录会员中心
    龙都娱乐