软件功能:
1.全屏、区域截图
2.涂鸦功能
3.画线,花圈,
4.水印
5.可保存本地硬盘
本节先考虑第一个功能:全屏,区域截图
第一步: 首先需要解决的问题是,如何让截取的图像,全屏显示。
一般的截图软件都是,点击截图后,首先动态抓取整个屏幕,然后全屏显示在整个屏幕--模拟屏幕,之后再在该模拟屏幕上进行其他动作。
所以我们先考虑两个动作
A. 抓取整个屏幕图片
B. 将抓取的屏幕图片全屏显示
对于A,Java有自带的方法可以使用:
java.awt.Robot robot = new Robot();
//截取指定区域部分的屏幕图像
BufferedImage screen = robot.createScreenCapture(new Rectangle(x, y, w, h));
对于B,则先考虑如何让窗口全屏显示。
我提供的方案为:
/**
* 全屏显示的窗口, 按 Alt + F4 退出
* @author pengranxiang
*/
class ScreenWindow extends JFrame {
private static final long serialVersionUID = -1;
public ScreenWindow() {
this.setUndecorated(true); //去掉窗口装饰
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setExtendedState(JFrame.MAXIMIZED_BOTH); //窗口最大化
}
public static void main(String[] args) {
new ScreenWindow();
}
}
有了全屏显示的窗口后,就只需要考虑如何将屏幕的截图加入窗口中显示。
要显示图片,Swing中一般使用 JLabel,那么将截图展示在JLabel中,然后再全屏显示,即可完成第一步
同时将鼠标光标设置为 “十字”,当出现模拟屏幕时,鼠标光标会变为“十字”作为提示,同时为下一步做准备。
完整代码:
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* 全屏显示的窗口, 按 Alt + F4 退出
* @author pengranxiang
*/
public class ScreenWindow extends JFrame {
private static final long serialVersionUID = -3758062802950480258L;
private Image image;
private JLabel imageLabel;
public ScreenWindow() throws AWTException, InterruptedException {
//取得屏幕尺寸
Dimension screenDims = Toolkit.getDefaultToolkit().getScreenSize();
//取得全屏幕截图
image = GraphicsUtils.getScreenImage(0, 0, screenDims.width, screenDims.height);
//用于展示截图
imageLabel = new JLabel(new ImageIcon(image));
//当鼠标在imageLabel上时,展示为 十字形
imageLabel.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
this.getContentPane().add(imageLabel);
this.setUndecorated(true); //去掉窗口装饰
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setExtendedState(JFrame.MAXIMIZED_BOTH); //窗口最大化
}
public static void main(String[] args) throws AWTException, InterruptedException {
new ScreenWindow();
}
}
class GraphicsUtils {
/**
* 截图屏幕中制定区域的图片
* @param x
* @param y
* @param w
* @param h
* @return 被截部分的BufferedImage对象
* @throws AWTException
* @throws InterruptedException
*/
public static BufferedImage getScreenImage(int x, int y, int w, int h) throws AWTException, InterruptedException {
Robot robot = new Robot();
BufferedImage screen = robot.createScreenCapture(new Rectangle(x, y, w, h));
return screen;
}
}
第二步:既然全屏截图和展示解决了,接下来就考虑在 模拟屏幕 中进行区域截图了。
模拟屏幕做成后,只要在JLabel中设置鼠标监听,取得鼠标按下和弹起时的坐标即可实现区域截图,仍然使用 getScreenImage() 即可。
完整代码:
import java.awt.AWTException;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* 全屏显示的窗口, 按 Alt + F4 退出
* @author pengranxiang
*/
public class ScreenWindow extends JFrame {
private static final long serialVersionUID = -3758062802950480258L;
private Image image;
private JLabel imageLabel;
private int x, y, xEnd, yEnd; //用于记录鼠标点击开始和结束的坐标
public ScreenWindow() throws AWTException, InterruptedException {
//取得屏幕尺寸
Dimension screenDims = Toolkit.getDefaultToolkit().getScreenSize();
//取得全屏幕截图
image = GraphicsUtils.getScreenImage(0, 0, screenDims.width, screenDims.height);
//用于展示截图
imageLabel = new JLabel(new ImageIcon(image));
//当鼠标在imageLabel上时,展示为 十字形
imageLabel.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
createAction();
this.getContentPane().add(imageLabel);
this.setUndecorated(true); //去掉窗口装饰
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setExtendedState(JFrame.MAXIMIZED_BOTH); //窗口最大化
}
/**
* 实现监听动作
*/
private void createAction() {
imageLabel.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
}
public void mouseReleased(MouseEvent e) {
xEnd = e.getX();
yEnd = e.getY();
//鼠标弹起时,取得鼠标起始两点组成的矩形区域的图像
try {
//因为 xEnd 可能比 x 小 (由右网左移动)起始坐标取其中较小值,xEnd - x 取其绝对值, 同样处理y
image = GraphicsUtils.getScreenImage(Math.min(x, xEnd), Math.min(y, yEnd), Math.abs(xEnd - x), Math.abs(yEnd - y));
} catch (AWTException e1) {
e1.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
//为了查看截图效果,将区域截图的部分代替全屏的截图展示
imageLabel.setIcon(new ImageIcon(image));
}
});
}
public static void main(String[] args) throws AWTException, InterruptedException {
new ScreenWindow();
}
}
class GraphicsUtils {
/**
* 截图屏幕中制定区域的图片
* @param x
* @param y
* @param w
* @param h
* @return 被截部分的BufferedImage对象
* @throws AWTException
* @throws InterruptedException
*/
public static BufferedImage getScreenImage(int x, int y, int w, int h) throws AWTException, InterruptedException {
Robot robot = new Robot();
BufferedImage screen = robot.createScreenCapture(new Rectangle(x, y, w, h));
return screen;
}
}
运行上面的程序,发现在抓取区域图像时,会搞不清截取的到底是那部分,所以接下来还需要为鼠标拖动时,画一个动态矩形来表示截取的部分,提高用户体验。
第三步:为截取图像时,鼠标所标示的截取区域用矩形表示出来。
分享到:
相关推荐
NULL 博文链接:https://pengranxiang.iteye.com/blog/935433
本项目是使用Swing实现的一个仿QQ截图小工具,它旨在提供类似QQ截图的功能,让用户在桌面环境中能够方便地进行屏幕截图并进行编辑。 首先,Swing组件库提供了丰富的组件,如JFrame、JButton、JPanel等,这些组件...
以下是对这个"java swing 截屏软件实现"的详细知识点解析: 1. **Swing组件**: Swing提供了一套丰富的组件库,如JFrame、JButton、JLabel等,用于构建用户界面。在这个截屏软件中,可能会用到JFrame作为主窗口,...
java swing 实现的带启动界面的简易截图软件,启动界面有进度条,可保存可粘贴到qq微信,简单实用
标题中的“Swing写的一个简易记事小软件”指的是使用Java Swing库开发的一款简单应用程序,主要用于记录日常事项。Swing是Java提供的一种图形用户界面(GUI)工具包,它允许开发者创建桌面应用,包括窗口、按钮、...
总的来说,用Java Swing实现一个PDF阅读器是一个涉及多方面技能的任务,包括对PDF格式的理解、Java GUI编程、IO操作以及第三方库的熟练使用。通过不断学习和实践,可以构建出功能强大且用户友好的PDF阅读器。
本项目是一套Java swing实现的一款餐厅点餐系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,...
最后,作者想说的是,1.9块钱的资源,你买不了吃亏,买不了上当,只需省一片绿箭口香糖的钱,你就能拥有一个用于整蛊的Java Swing实现,你在玩的过程中,还可以初步了解一些Java Swing的知识,如此说来,少年,抓紧时间下载吧。
【Swing小管理项目源码】是一个基于Java Swing开发的桌面应用程序示例,它涵盖了多个核心功能,包括用户界面的设计、数据操作以及交互逻辑。Swing是Java的标准库,用于构建图形用户界面(GUI),提供了丰富的组件库...
9. 计算器的实现:计算器是Java swing组件中的一种常见应用,通过使用JFrame、JButton、JPanel、JTextArea等组件,可以创建一个简单的计算器。 10. 代码优化:代码优化是Java swing组件中的一种重要步骤,用于优化...
java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java ...
在这个特定的Demo中,我们关注的是如何使用Swing来实现一个商品列表,其中包含商品的数量加减功能以及整行删除的功能。这个功能通常在电商应用或者库存管理软件中会用到。 首先,我们需要了解`JTable`,这是Swing中...
这个“Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip”文件是一个示例项目,展示了如何利用Swing构建一个基本的多用户聊天应用。下面将详细阐述其涉及的关键知识点。 1. **Swing组件**:Swing提供了丰富的...
本项目是一套基于Java Swing实现的日历记事本系统,主要针对计算机相关专业的正在学习java的学生与需要项目实战练习的Java学习者。 包含:项目源码、报告文档等。 项目都经过严格调试,确保可以运行! 该系统功能...
本项目"java swing写的聊天软件"利用了Swing组件来设计和实现了一个能够支持多达1000个用户同时在线的聊天应用。以下是关于这个聊天软件的关键知识点和实现细节: 1. **Swing组件库**:Swing 提供了丰富的组件,如...
java贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇...
"java 截屏 swing"这个主题涉及到的是如何利用Swing来实现屏幕截图功能。在这个项目中,开发人员创建了一个应用程序,允许用户选择屏幕上的任意矩形区域进行截图,未被选中的部分会显示为阴影效果,同时支持拖动和...
在"Java Swing实现一个记事本"这个项目中,我们主要关注的是如何使用Swing来创建一个功能完备的文本编辑器,类似于Windows中的记事本。下面将详细介绍涉及的关键技术和知识点。 1. **JFrame**: JFrame是Java Swing...
标题 "一个神奇的Swing软件Jgoodies" 暗示了我们正在讨论的是一个基于Java Swing库的扩展工具,Jgoodies。Jgoodies是一个由Karsten Lentzsch开发的开源项目,它提供了一系列的Java组件、布局管理器、绑定机制以及...
本项目是一个基于Java Swing的通讯录软件,它的主要目标是帮助初学者了解如何将GUI应用与数据库系统集成,特别是SQL数据库。 首先,我们要理解Java Swing的基本概念。Swing是Java AWT(Abstract Window Toolkit)的...