http://www.oschina.net/question/12_63302
这是一篇入门级文章,高手请略过。
在这篇文章中我们将学习如何用 Java 对图像进行剪裁并将剪裁出来的部分单独保存到文件中。
我们将通过以下步骤来学习:
- 输入图像,指定要处理的图像路径允许用户拖放要剪裁的部分选择后使用 Robot 类来确定剪裁部分的坐标剪裁所选图像并保持
接下来我们开始编码部分。
Listing1: 引入的类
12345678910import
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: 入口类
1234567public
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
12345678910public
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: 鼠标事件处理函数
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162@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 方法
123456789101112public
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
12345678910111213141516171819202122232425262728293031import
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102import
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);
}
}
也许不是自己该去发挥的地方,还是让自己到最适合自己战斗的方面去吧!勇敢的接受自己的失败,