java裁剪图片并保存的示例分享

 更新时间:2014年01月03日 11:34:21   作者:  
在这篇文章中我们将学习如何用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);   

}

相关文章

  • 解决spring中redistemplate不能用通配符keys查出相应Key的问题

    解决spring中redistemplate不能用通配符keys查出相应Key的问题

    这篇文章主要介绍了解决spring中redistemplate不能用通配符keys查出相应Key的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Spring web开发教程之Request获取3种方式

    Spring web开发教程之Request获取3种方式

    这篇文章主要给大家介绍了关于Spring web开发教程之Request获取3种方式的相关资料,request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息,需要的朋友可以参考下
    2023-11-11
  • Java和scala实现 Spark RDD转换成DataFrame的两种方法小结

    Java和scala实现 Spark RDD转换成DataFrame的两种方法小结

    今天小编就为大家分享一篇Java和scala实现 Spark RDD转换成DataFrame的两种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Java统计代码的执行时间的N种方法

    Java统计代码的执行时间的N种方法

    在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Java 中比较常用的执行时间统计方法,总共包含以下 6 种,需要的朋友可以参考下
    2022-08-08
  • java如何在应用代码里捕获线程堆栈

    java如何在应用代码里捕获线程堆栈

    这篇文章主要为大家介绍了java如何在应用代码里捕获线程堆栈实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Java StringTokenizer分隔符拆分字符串

    Java StringTokenizer分隔符拆分字符串

    Java中的StringTokenizer类用于将一个字符串分解成标记,本文主要介绍了Java StringTokenizer分隔符拆分字符串,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 详解SpringBoot中时间类型的序列化与反序列化

    详解SpringBoot中时间类型的序列化与反序列化

    这篇文章主要为大家详细介绍了SpringBoot中时间类型的序列化与反序列化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-02-02
  • Java动态代理模式的深入揭秘

    Java动态代理模式的深入揭秘

    这篇文章主要给大家介绍了关于Java动态代理模式的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • MyBatis的MapKey注解实例解析

    MyBatis的MapKey注解实例解析

    这篇文章主要为大家介绍了MyBatis的MapKey注解实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java 四种基本加密算法分析

    Java 四种基本加密算法分析

    这篇文章主要介绍了Java 四种基本加密算法分析的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论