Java中实现可拖放图片剪裁入门教程

 更新时间:2015年01月15日 10:23:16   投稿:junjie  
这篇文章主要介绍了Java中实现可拖放图片剪裁入门教程,本文写给新手,分步骤讲解如何实现图片裁剪,并对每步的代码作注释,需要的朋友可以参考下

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

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

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

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

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

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;

说明:

1.Graphics 类包含绘制矩形的方法
2.我们使用 Rectangle 类作为拖拉的矩形区域以作剪裁
3.Robot 类用于捕获屏幕截图
4.使用鼠标侦听器来获取鼠标的拖拉时间
5.Robot 类使用 BufferedImage 来做图像处理
6.File 类用于打开图像文件
7.ImageIO 类用于将图像写到 png 或者 jpg 图像文件中
8.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();
}

说明:

1.编写了一个名为 CropImage 的类
2.该类扩展了 JFrame 以实现 frame 的所有功能
3.实现了不同的鼠标事件侦听器以便知道用户什么时候开始拖动鼠标指针
4.drag_status 变量用于保存鼠标开始拖动时的坐标
5.我们定义了 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);
}

说明:

1.我们定义一个名为 ImagePanel 的类,使用要处理的图像作为参数
2.在 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);

}

说明:

1.当鼠标按下时存储当前坐标到 c1 和 c2
2.当鼠标按下并开始拖动时将拖动状态变量 drag_status 设置为 true
3.到鼠标按键松开时表示图像剪裁区域已经选择完毕,调用 draggedscreen 方法
4.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.");
}}

说明:

1.首先计算图像的高度和宽度
2.使用 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);
}
}

相关文章

  • redisson实现分布式锁原理

    redisson实现分布式锁原理

    本文将详细介绍redisson实现分布式锁原理。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • java中调用super的实例讲解

    java中调用super的实例讲解

    在本篇文章里小编给大家分享了一篇关于java中调用super的实例讲解内容,有兴趣的朋友们可以学习下。
    2020-12-12
  • Struts2数据输入验证教程详解

    Struts2数据输入验证教程详解

    这篇文章主要介绍了Struts2数据输入验证教程详解的相关资料,输入数据验证的方法有两种,本文给大家介绍的非常详细,需要的朋友可以参考下
    2016-10-10
  • Intellij IDEA官方最完美编程字体Mono使用

    Intellij IDEA官方最完美编程字体Mono使用

    这篇文章主要介绍了Intellij IDEA官方最完美编程字体Mono使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • SpringBoot-RestTemplate如何实现调用第三方API

    SpringBoot-RestTemplate如何实现调用第三方API

    这篇文章主要介绍了SpringBoot-RestTemplate实现调用第三方API的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java实现文件重命名的方法

    java实现文件重命名的方法

    这篇文章主要介绍了java实现文件重命名的方法,涉及java针对文件的重命名操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • SpringBoot集成内存数据库Sqlite的实践

    SpringBoot集成内存数据库Sqlite的实践

    sqlite这样的内存数据库,小巧可爱,做小型服务端演示程序,非常好用,本文主要介绍了SpringBoot集成Sqlite,具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • mybatis-plus:xml拼接sql方式

    mybatis-plus:xml拼接sql方式

    这篇文章主要介绍了mybatis-plus:xml拼接sql方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • @Async异步线程池以及线程的命名方式

    @Async异步线程池以及线程的命名方式

    这篇文章主要介绍了@Async异步线程池以及线程的命名方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java工程中可执行JAR两种打包方式详解

    Java工程中可执行JAR两种打包方式详解

    这篇文章主要为大家详细介绍了Java工程中可执行JAR两种打包方式,一体化可执行包和带外部依赖lib的可执行包,有需要的小伙伴可以学习一下
    2024-04-04

最新评论