这是一篇入门级文章,高手请略过。
在这篇文章中我们将学习如何用 Java 对图像进行剪裁并将剪裁出来的部分单独保存到文件中。
我们将通过以下步骤来学习:
- 输入图像,指定要处理的图像路径
- 允许用户拖放要剪裁的部分
- 选择后使用 Robot 类来确定剪裁部分的坐标
- 剪裁所选图像并保持
接下来我们开始编码部分。
Listing1: 引入的类
01 |
import java.awt.Graphics; |
02 |
import java.awt.Rectangle; |
03 |
import java.awt.Robot; |
04 |
import java.awt.event.MouseEvent; |
05 |
import java.awt.event.MouseListener; |
06 |
import java.awt.event.MouseMotionListener; |
07 |
import java.awt.image.BufferedImage; |
08 |
import java.io.File; |
09 |
import javax.imageio.ImageIO; |
10 |
import javax.swing.JFrame; |
说明:
- Graphics 类包含绘制矩形的方法
- 我们使用 Rectangle 类作为拖拉的矩形区域以作剪裁
- Robot 类用于捕获屏幕截图
- 使用鼠标侦听器来获取鼠标的拖拉时间
- Robot 类使用 BufferedImage 来做图像处理
- File 类用于打开图像文件
- ImageIO 类用于将图像写到 png 或者 jpg 图像文件中
- JFrame 用于显示界面
现在我们编写包含 main 方法的入口类
Listing2: 入口类
1 |
public class CropImage extends JFrame implements MouseListener, MouseMotionListener |
2 |
{ |
3 |
int drag_status= 0 ,c1,c2,c3,c4; |
4 |
public static void main(String args[]) |
5 |
{ |
6 |
new CropImage().start(); |
7 |
} |
说明:
- 编写了一个名为 CropImage 的类
- 该类扩展了 JFrame 以实现 frame 的所有功能
- 实现了不同的鼠标事件侦听器以便知道用户什么时候开始拖动鼠标指针
- drag_status 变量用于保存鼠标开始拖动时的坐标
- 我们定义了 main 方法去调用一个 start 方法,这个方法将在下面定义
接下来是 start 方法
Listing 2
01 |
public void start() |
02 |
{ |
03 |
ImagePanel im= new ImagePanel( "F:\\Wallpaper\\wallpapers\\1.jpg" ); |
04 |
add(im); |
05 |
setSize( 400 , 400 ); |
06 |
setVisible( true ); |
07 |
addMouseListener( this ); |
08 |
addMouseMotionListener( this ); |
09 |
setDefaultCloseOperation(EXIT_ON_CLOSE); |
10 |
} |
说明:
- 我们定义一个名为 ImagePanel 的类,使用要处理的图像作为参数
- 在 JFrame 中放置这个要显示图片的 ImagePanel,并开始侦听鼠标事件
下面我们定义用于处理鼠标事件的方法
Listing 3: 鼠标事件处理函数
01 |
@Override |
02 |
public void mouseClicked(MouseEvent arg0) { |
03 |
} |
04 |
05 |
@Override |
06 |
public void mouseEntered(MouseEvent arg0) { |
07 |
} |
08 |
09 |
@Override |
10 |
public void mouseExited(MouseEvent arg0) { |
11 |
} |
12 |
13 |
@Override |
14 |
public void mousePressed(MouseEvent arg0) { |
15 |
repaint(); |
16 |
c1=arg0.getX(); |
17 |
c2=arg0.getY(); |
18 |
} |
19 |
20 |
@Override |
21 |
public void mouseReleased(MouseEvent arg0) { |
22 |
repaint(); |
23 |
if (drag_status== 1 ) |
24 |
{ |
25 |
c3=arg0.getX(); |
26 |
c4=arg0.getY(); |
27 |
try |
28 |
{ |
29 |
draggedScreen(); |
30 |
} |
31 |
catch (Exception e) |
32 |
{ |
33 |
e.printStackTrace(); |
34 |
} |
35 |
} |
36 |
} |
37 |
38 |
@Override |
39 |
public void mouseDragged(MouseEvent arg0) { |
40 |
repaint(); |
41 |
drag_status= 1 ; |
42 |
c3=arg0.getX(); |
43 |
c4=arg0.getY(); |
44 |
} |
45 |
46 |
@Override |
47 |
public void mouseMoved(MouseEvent arg0) { |
48 |
49 |
} |
50 |
51 |
public void paint(Graphics g) |
52 |
{ |
53 |
super .paint(g); |
54 |
int w = c1 - c3; |
55 |
int h = c2 - c4; |
56 |
w = w * - 1 ; |
57 |
h = h * - 1 ; |
|