软件功能:
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
java swing 截屏软件实现,下载文件导入eclipse即可,可运行。
swing实现的仿qq截图小工具 功能比较完善 项目可直接导入Eclipse中 也可直接运行jar包查看效果
java swing 实现的带启动界面的简易截图软件,启动界面有进度条,可保存可粘贴到qq微信,简单实用
java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java ...
java贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇...
本项目是一套Java swing实现的一款餐厅点餐系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,...
Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip
java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...
这个java项目是一个基于数据库的简单jdbc项目,只要在自己数据库中建立相应的表就可以实现操作。比较简单,可以帮助大家学习.
本项目是一套基于Java swing和mysql实现的银行管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。...
java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing ...
最后,作者想说的是,1.9块钱的资源,你买不了吃亏,买不了上当,只需省一片绿箭口香糖的钱,你就能拥有一个用于整蛊的Java Swing实现,你在玩的过程中,还可以初步了解一些Java Swing的知识,如此说来,少年,抓紧时间下载吧。
使用java swing和开源jar包jgraph完成的故障分析树软件。包含可执行jar文件,源代码,以及说明文档和演示的PPT,视频。 图形界面美观,自动由公式生成树形结构,也可以用鼠标增删改。支持图形和公式编辑以及切换。
基于java swing实现的贪吃蛇小游戏源码+可执行的jar文件
这款Java swing实现的学生信息管理系统和jsp版本的功能很相似,简单的实现了班级信息的增删改查,学生信息的增删改查,数据库采用的是mysql,jdk版本不限,是Java学习者学习参考非常好的一个小项目,下面我们来看看...
自己做的通讯录,主要是练习的,对初学者有用 导入工程之后要重新添加sqljdbc驱动,数据库没有给出,不过有创建数据库的语句了 采用布局管理,图片是直接存入数据库的(建议不用这个方法)
基于java的QQ截屏工具的设计和实现能够实现对屏幕的随机截取,复制,保存以及添加文字等操作,便于用户对数据的处理。 该软件的功能: (1)随机获取屏幕指定区域; (2)编辑(添加文字)截图; (3)存储...
用swing和Socket写的局域网聊天系统,实现点对点,点对面的消息发送,登陆数据库采用Oracle 就一个登陆表。
用于swing学习,入门专用。实现了多线程通讯和私聊。