java 设置截图裁剪区_如何在Java中进行图片剪裁

本文介绍了如何使用 Java 实现图像剪裁功能。通过指定图像路径,利用 Robot 类进行屏幕截图,结合鼠标事件监听实现用户选择裁剪区域,并将剪裁后的图像保存到新的文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

输入图像,指定要处理的图像路径

允许用户拖放要剪裁的部分

选择后使用 Robot 类来确定剪裁部分的坐标

剪裁所选图像并保持

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

Listing1:引入的类

importjava.awt.Graphics;

importjava.awt.Rectangle;

importjava.awt.Robot;

importjava.awt.event.MouseEvent;

importjava.awt.event.MouseListener;

importjava.awt.event.MouseMotionListener;

importjava.awt.image.BufferedImage;

importjava.io.File;

importjavax.imageio.ImageIO;

importjavax.swing.JFrame;

说明:

Graphics 类包含绘制矩形的方法

我们使用 Rectangle 类作为拖拉的矩形区域以作剪裁

Robot 类用于捕获屏幕截图

使用鼠标侦听器来获取鼠标的拖拉时间

Robot 类使用 BufferedImage 来做图像处理

File 类用于打开图像文件

ImageIO 类用于将图像写到 png 或者 jpg 图像文件中

JFrame 用于显示界面

现在我们编写包含 main 方法的入口类

Listing2: 入口类

publicclassCropImageextendsJFrameimplementsMouseListener, MouseMotionListener

{

intdrag_status=0,c1,c2,c3,c4;

publicstaticvoidmain(String args[])

{

newCropImage().start();

}

说明:

编写了一个名为 CropImage 的类

该类扩展了 JFrame 以实现 frame 的所有功能

实现了不同的鼠标事件侦听器以便知道用户什么时候开始拖动鼠标指针

drag_status 变量用于保存鼠标开始拖动时的坐标

我们定义了 main 方法去调用一个 start 方法,这个方法将在下面定义

接下来是 start 方法

Listing 2

publicvoidstart()

{

ImagePanel im=newImagePanel("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

publicvoidmouseClicked(MouseEvent arg0) {

}

@Override

publicvoidmouseEntered(MouseEvent arg0) {

}

@Override

publicvoidmouseExited(MouseEvent arg0) {

}

@Override

publicvoidmousePressed(MouseEvent arg0) {

repaint();

c1=arg0.getX();

c2=arg0.getY();

}

@Override

publicvoidmouseReleased(MouseEvent arg0) {

repaint();

if(drag_status==1)

{

c3=arg0.getX();

c4=arg0.getY();

try

{

draggedScreen();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

@Override

publicvoidmouseDragged(MouseEvent arg0) {

repaint();

drag_status=1;

c3=arg0.getX();

c4=arg0.getY();

}

@Override

publicvoidmouseMoved(MouseEvent arg0) {

}

publicvoidpaint(Graphics g)

{

super.paint(g);

intw = c1 - c3;

inth = 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 方法

publicvoiddraggedScreen()throwsException

{

intw = c1 - c3;

inth = c2 - c4;

w = w * -1;

h = h * -1;

Robot robot =newRobot();

BufferedImage img = robot.createScreenCapture(newRectangle(c1, c2,w,h));

File save_path=newFile("screen1.jpg");

ImageIO.write(img,"JPG", save_path);

System.out.println("Cropped image saved successfully.");

}}

说明:

首先计算图像的高度和宽度

使用 Robot 类来对剪裁的区域进行截图并保持到另外一个文件 screen1.jpg

完整的代码

Listing 5:ImagePanel.java

importjava.awt.Dimension;

importjava.awt.Graphics;

importjava.awt.Image;

importjavax.swing.ImageIcon;

importjavax.swing.JPanel;

classImagePanelextendsJPanel {

privateImage img;

publicImagePanel(String img) {

this(newImageIcon(img).getImage());

}

publicImagePanel(Image img) {

this.img = img;

Dimension size =newDimension(img.getWidth(null), img.getHeight(null));

// Dimension size = new Dimension(10,10);

setPreferredSize(size);

setMinimumSize(size);

setMaximumSize(size);

setSize(size);

setLayout(null);

}

publicvoidpaintComponent(Graphics g) {

g.drawImage(img,0,0,null);

}

}

Listing 6:CropImage.java

importjava.awt.Graphics;

importjava.awt.Rectangle;

importjava.awt.Robot;

importjava.awt.event.MouseEvent;

importjava.awt.event.MouseListener;

importjava.awt.event.MouseMotionListener;

importjava.awt.image.BufferedImage;

importjava.io.File;

importjavax.imageio.ImageIO;

importjavax.swing.JFrame;

publicclassCropImageextendsJFrameimplementsMouseListener, MouseMotionListener

{

intdrag_status=0,c1,c2,c3,c4;

publicstaticvoidmain(String args[])

{

newCropImage().start();

}

publicvoidstart()

{

ImagePanel im=newImagePanel("F:\\Wallpaper\\wallpapers\\1.jpg");

add(im);

setSize(400,400);

setVisible(true);

addMouseListener(this);

addMouseMotionListener(this);

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

publicvoiddraggedScreen()throwsException

{

intw = c1 - c3;

inth = c2 - c4;

w = w * -1;

h = h * -1;

Robot robot =newRobot();

BufferedImage img = robot.createScreenCapture(newRectangle(c1, c2,w,h));

File save_path=newFile("screen1.jpg");

ImageIO.write(img,"JPG", save_path);

System.out.println("Cropped image saved successfully.");

}

@Override

publicvoidmouseClicked(MouseEvent arg0) {

}

@Override

publicvoidmouseEntered(MouseEvent arg0) {

}

@Override

publicvoidmouseExited(MouseEvent arg0) {

}

@Override

publicvoidmousePressed(MouseEvent arg0) {

repaint();

c1=arg0.getX();

c2=arg0.getY();

}

@Override

publicvoidmouseReleased(MouseEvent arg0) {

repaint();

if(drag_status==1)

{

c3=arg0.getX();

c4=arg0.getY();

try

{

draggedScreen();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

@Override

publicvoidmouseDragged(MouseEvent arg0) {

repaint();

drag_status=1;

c3=arg0.getX();

c4=arg0.getY();

}

@Override

publicvoidmouseMoved(MouseEvent arg0) {

}

publicvoidpaint(Graphics g)

{

super.paint(g);

intw = c1 - c3;

inth = c2 - c4;

w = w * -1;

h = h * -1;

if(w<0)

w = w * -1;

g.drawRect(c1, c2, w, h);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值