Java如何实现一个图片剪裁功能
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); } }
以上是Java如何实现一个图片剪裁功能的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处
