`

Swing 实现截图小软件 (一)

阅读更多

软件功能:            
             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;
	}
}
 

运行上面的程序,发现在抓取区域图像时,会搞不清截取的到底是那部分,所以接下来还需要为鼠标拖动时,画一个动态矩形来表示截取的部分,提高用户体验。

 

第三步:为截取图像时,鼠标所标示的截取区域用矩形表示出来。

 

分享到:
评论
2 楼 nick.s.ni 2011-02-25  
Ivan_Pig 写道
几年前写了个。
功能和lz差不多,支持直接截图到剪切板。

后来改成了netbeans插件,放到了官网上,插件列表里面可以搜到,叫PigShot.

截图实际就是拍了张桌面的快照,然后在快照上的操作。这种方式没法抓鼠标,不知道有什么解决方案。

使用印屏幕鍵,程序監控剪切板和按鍵。有截圖了將圖片顯示出來
1 楼 Ivan_Pig 2011-02-25  
几年前写了个。
功能和lz差不多,支持直接截图到剪切板。

后来改成了netbeans插件,放到了官网上,插件列表里面可以搜到,叫PigShot.

截图实际就是拍了张桌面的快照,然后在快照上的操作。这种方式没法抓鼠标,不知道有什么解决方案。

相关推荐

    Swing 实现截图小软件 (五)

    NULL 博文链接:https://pengranxiang.iteye.com/blog/935433

    swing实现的仿qq截图小工具

    本项目是使用Swing实现的一个仿QQ截图小工具,它旨在提供类似QQ截图的功能,让用户在桌面环境中能够方便地进行屏幕截图并进行编辑。 首先,Swing组件库提供了丰富的组件,如JFrame、JButton、JPanel等,这些组件...

    java swing 截屏软件实现

    以下是对这个"java swing 截屏软件实现"的详细知识点解析: 1. **Swing组件**: Swing提供了一套丰富的组件库,如JFrame、JButton、JLabel等,用于构建用户界面。在这个截屏软件中,可能会用到JFrame作为主窗口,...

    java swing 实现的带启动界面的简易截图软件

    java swing 实现的带启动界面的简易截图软件,启动界面有进度条,可保存可粘贴到qq微信,简单实用

    Swing写的一个简易记事小软件

    标题中的“Swing写的一个简易记事小软件”指的是使用Java Swing库开发的一款简单应用程序,主要用于记录日常事项。Swing是Java提供的一种图形用户界面(GUI)工具包,它允许开发者创建桌面应用,包括窗口、按钮、...

    java swing实现pdf阅读器

    总的来说,用Java Swing实现一个PDF阅读器是一个涉及多方面技能的任务,包括对PDF格式的理解、Java GUI编程、IO操作以及第三方库的熟练使用。通过不断学习和实践,可以构建出功能强大且用户友好的PDF阅读器。

    Java swing实现的一款餐厅点餐系统

    本项目是一套Java swing实现的一款餐厅点餐系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,...

    使用Java Swing实现了抖音上的表白程序

    最后,作者想说的是,1.9块钱的资源,你买不了吃亏,买不了上当,只需省一片绿箭口香糖的钱,你就能拥有一个用于整蛊的Java Swing实现,你在玩的过程中,还可以初步了解一些Java Swing的知识,如此说来,少年,抓紧时间下载吧。

    Swing小管理项目源码

    【Swing小管理项目源码】是一个基于Java Swing开发的桌面应用程序示例,它涵盖了多个核心功能,包括用户界面的设计、数据操作以及交互逻辑。Swing是Java的标准库,用于构建图形用户界面(GUI),提供了丰富的组件库...

    基于Java swing组件实现简易计算器

    9. 计算器的实现:计算器是Java swing组件中的一种常见应用,通过使用JFrame、JButton、JPanel、JTextArea等组件,可以创建一个简单的计算器。 10. 代码优化:代码优化是Java swing组件中的一种重要步骤,用于优化...

    java swing实现学生住宿管理系统(源码)

    java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java ...

    JAVA Swing 实现商品列表,数量加减 ,删除整行 Demo

    在这个特定的Demo中,我们关注的是如何使用Swing来实现一个商品列表,其中包含商品的数量加减功能以及整行删除的功能。这个功能通常在电商应用或者库存管理软件中会用到。 首先,我们需要了解`JTable`,这是Swing中...

    Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip

    这个“Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip”文件是一个示例项目,展示了如何利用Swing构建一个基本的多用户聊天应用。下面将详细阐述其涉及的关键知识点。 1. **Swing组件**:Swing提供了丰富的...

    基于Java Swing实现的日历记事本系统【源码+报告文档】

    本项目是一套基于Java Swing实现的日历记事本系统,主要针对计算机相关专业的正在学习java的学生与需要项目实战练习的Java学习者。 包含:项目源码、报告文档等。 项目都经过严格调试,确保可以运行! 该系统功能...

    java swing写的聊天软件

    本项目"java swing写的聊天软件"利用了Swing组件来设计和实现了一个能够支持多达1000个用户同时在线的聊天应用。以下是关于这个聊天软件的关键知识点和实现细节: 1. **Swing组件库**:Swing 提供了丰富的组件,如...

    javaswing实现贪吃蛇源码

    java贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇...

    java 截屏 swing

    "java 截屏 swing"这个主题涉及到的是如何利用Swing来实现屏幕截图功能。在这个项目中,开发人员创建了一个应用程序,允许用户选择屏幕上的任意矩形区域进行截图,未被选中的部分会显示为阴影效果,同时支持拖动和...

    Java Swing实现一个记事本

    在"Java Swing实现一个记事本"这个项目中,我们主要关注的是如何使用Swing来创建一个功能完备的文本编辑器,类似于Windows中的记事本。下面将详细介绍涉及的关键技术和知识点。 1. **JFrame**: JFrame是Java Swing...

    一个神奇的swing软件Jgoodies

    标题 "一个神奇的Swing软件Jgoodies" 暗示了我们正在讨论的是一个基于Java Swing库的扩展工具,Jgoodies。Jgoodies是一个由Karsten Lentzsch开发的开源项目,它提供了一系列的Java组件、布局管理器、绑定机制以及...

    java swing做的通讯录软件连接sql

    本项目是一个基于Java Swing的通讯录软件,它的主要目标是帮助初学者了解如何将GUI应用与数据库系统集成,特别是SQL数据库。 首先,我们要理解Java Swing的基本概念。Swing是Java AWT(Abstract Window Toolkit)的...

Global site tag (gtag.js) - Google Analytics