服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - java裁剪图片并保存的示例分享

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

2019-10-27 12:20java教程网 JAVA教程

在这篇文章中我们将学习如何用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);    
}  

 

延伸 · 阅读

精彩推荐
北京塞车全天计划精准版 投资理财平台倒闭了我里面的钱怎么办 360山东11选5 股票涨跌谁决定的 江西股票融资 四场比分开奖结果 2012上证指数 股票涨跌颜色消失了怎么办 今曰快三甘肃开奖结果 股票融资费用_杨方配资平台 河北十一选五遗漏数 无锡股票配资 配资平台哪个好推荐杨方配资 今天上海快三 河北快三基本走势图 股票涨跌及统计学 最大的合法配资平台