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

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

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

选择后使用 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);

}

}

java图片裁剪并保存_java裁剪图片并保存的示例分享相关推荐

  1. Java处理图片后图片变小了_JAVA改变图片大小,该怎么处理

    JAVA改变图片大小 我实现了改变图片大小,但是分辨率有很大的影响,求教JAVA中的类或者算法解决这个问题,使之可以改变图片大小,同时不影响图片质量 java 图片 算法 类 分享到: ------解 ...

  2. java怎么做图形界面_java怎么做图形界面?实例分享

    学习java不仅要学会写程序,也要学会做图形界面,可是做图形界面对于一些刚学java的人员来说还是比较困难的,那么今天我们就给大家分享一下java做图形界面的方法. 首先我们来了解一下创建图形界面时常 ...

  3. java 删除空行_java实现文本文件删除空行的示例分享

    java删除文本文件空行import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; ...

  4. java旋转图片并画出_java实现图片角度旋转并获得图片信息

    本文实例为大家分享了java实现图片角度旋转并获得图片信息的具体代码,供大家参考,具体内容如下 public class demo { /** * 调整图片角度 * make by dongxh 20 ...

  5. java图片转成字符串_JAVA将图片(本地或者网络资源)转为Base64字符串,将base64字符串存储为本地图片...

    网络资源代码 import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOExcep ...

  6. java 跨域上传_java后台图片跨域上传图片 文件

    发送方 @ResponseBody @RequestMapping(value="/imgUpLoadNewOneKuaYu")public String imgUpLoadNew ...

  7. java图片加文字水印_JAVA实现图片的修改,添加文字水印效果

    JAVA实现图片的修改,添加文字水印效果,根据文字内容生成图片,下面是具体的代码,以及测试方法: 实现类: package JavaMoImage; import javax.p_w_picpathi ...

  8. java 图片文件 格式转换_Java的图片文件格式转换和线性缩放

    Java的图片文件格式转换和线性缩放 来源:68design.net 2007年07月13日 08:31 图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码,推荐用jimi包,可从 htt ...

  9. java图片怎么定义属性_Java读写图片XMP元数据XMPMeta(自定义属性信息)

    起因 因项目需要,要求在JPG图片中添加自定义属性信息,在网上找了很久,发现大多数是读取ESIF信息,键值信息都是固定死的,不符合需求,后面找到了com.adobe.xmp类库,也没找到关于XMP数据 ...

最新文章

  1. Cookie获取用户的访问记录
  2. BeanUtils工具的使用(转载)
  3. web developer tips (78):使用文档大纲导航
  4. 苦逼的是怎么又有东西没记住,但我们依然每天坚持一遍、一遍又一遍指导记住为止。
  5. Linux运维之道之ENGINEER1.3(配置SMB共享,配置NFS共享)
  6. JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法
  7. 【Playable API】不用Animator如何播放动画?
  8. DAS-DVS分布式光纤振动传感-发展现状与未来趋势分析(华为光纤传感新产品Huawei OptiXsense EF3000)
  9. 工作流(activiti7)-简单的介绍和使用(二)
  10. WIN10取消密码和休眠密码
  11. 【24】基于java的宠物医院管理系统
  12. ADI为何对MEMS传感器一往情深?
  13. 三面网易,四面阿里,五年开发经验程序员剑指大厂,稳拿P7offer
  14. JAVA 面试 事务_《java面试宝典》之事务常见面试题
  15. 菜鸟学-业务流程图、数据流图、模块结构图
  16. 教师招聘面试视频 计算机,怎么准备教师招聘面试试讲?(附视频)
  17. 使用7号电池的科学计算机,新奇:可以用USB充电的5号、7号电池
  18. GitLab 安全漏洞 (CVE-2016-4340)复现
  19. CTF密码学总结(一)
  20. 数据结构复习题(线性表)

热门文章

  1. chart控件做实时曲线显示_Python 如何实时绘制数据
  2. python写日志文件_Python logging日志模块 配置文件方式
  3. 场景数据的动态更新setDataVariance(osg::Object::DYNAMIC) (转)
  4. Android开发之虹软人脸识别活体检测基本步骤
  5. 高中计算机计划,高中信息技术教学计划
  6. 网页设计上机考试原题_《网页设计》上机考试试题
  7. AFNetworking 学习笔记
  8. Prometheus学系列(十九)之PromQL基础
  9. 【跟着我们学Golang】Go语言全平台安装
  10. docker 常用命令(1)