截图之路01

本文详细介绍了如何使用Java语言实现一个全屏无边框的截图软件,并提供了关键代码片段,包括全屏显示、无边框窗口设置及将桌面截图作为程序背景的方法。文章最后指出,虽然已解决核心问题,但截图软件的开发还有更多待完善之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

走着走着你就会发现,曾经的心痛,如今没什么大不了--------------路


环境:Ubuntu 14.04,Eclipse

编程语言JAVA


接触截图最早源于自定义窗体的实现,当初是用截图来模拟自定义的完全透明的窗体。


其实截图的代码很简单就有限的几句话,但是要写成一个截图软件并不想看起来那么简单,其中有很多问题需要解决。

如何在桌面上截图。截图程序并不是真的直接在桌面上截图的,它其实就是把整个桌面截图下来当作程序(这个程序应该是无边框的)的背景。

1、截图程序应该是全屏的。

2、程序窗口应该完全无边框。

3、程序的背景就是电脑桌面。

目前阶段只有这些问题需要考虑,后续还有一些问题后面再说。


首先说第一个全屏问题。网上有很多例子教你怎么让你的程序全屏,这里我就不一一介绍,我只说两个我在程序中用到的。

第一个当然是用JFrame的setSize(int width, int height)方法了。先获取桌面大小,然后设置窗口大小。

【全屏代码】

JFrame frame = new JFrame();
Robot rbt = new Robot();  
Toolkit tk = Toolkit.getDefaultToolkit();  
Dimension dim = tk.getScreenSize();  
frame.setSize(dim.getWidth(), dim.getHeight());
第二个先获取运行环境的Graphics,然后获取本地环境的Graphics,接着获取屏幕设备,最后设置全屏的窗口。有点绕哈。

【全屏代码】

JFrame frame = new JFrame();
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(frame);


在说窗口无边框的问题。窗口无边框也很简单,就一句话。

【设置无边框代码】

JFrame frame = new JFrame();
frame.setUndecorated(true);							// 设置无边框

最后说说程序的背景就是电脑桌面的问题。这里有两小点,第一个就是截取全屏,第二个就是把截下来的全屏图当作程序背景。

【截全屏代码片段】

Robot rbt = new Robot();  
Toolkit tk = Toolkit.getDefaultToolkit();  
Dimension dim = tk.getScreenSize();  
Image image = rbt.createScreenCapture(new Rectangle(0, 0, (int) dim.getWidth(), (int) dim.getHeight()));

如何把截下来的image设置到JFrame中当作背景呢?我就不买关子了,直接上代码吧。就重写下JFrame的paint()方法即可。

@Override
public void paint(Graphics g) {

	// 获取窗口当前位置,左上角坐标
	Point pos = this.getLocationOnScreen();
	Point offset = new Point(-pos.x, -pos.y);
	// 载入图片,x,y 是 图片的左上角 相对于 窗口的左上角 的坐标
	g.drawImage(image, offset.x, offset.y, null);
}
到此刚提出的三个问题都已经解决了。下面我们总结一下代码。


------------------------------------------------------ 分割线 --------------------------------------------------------------

【完整代码】

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

public class SimpleTest  extends JFrame{
	private static final long serialVersionUID = 1L;		// 对象串行化UID

	/**
	 * 背景图片
	 */
	private BufferedImage image = null;
	
	public SimpleTest(){
		this.updateBackground();
	}
	
	public static void main(String[] args) {
		SimpleTest frame = new SimpleTest();
		frame.setUndecorated(true);							// 设置无边框
		GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(frame);
		frame.setVisible(true);
	}
	
	@Override
	public void paint(Graphics g) {

		// 获取窗口当前位置,左上角坐标
		Point pos = this.getLocationOnScreen();
		Point offset = new Point(-pos.x, -pos.y);
		// 载入图片,x,y 是 图片的左上角 相对于 窗口的左上角 的坐标
		g.drawImage(image, offset.x, offset.y, null);
	}
	
	public void updateBackground() {             // 截屏,获得背景图片  
        try {  
            // Robot类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。  
            //Robot 的主要目的是便于 Java 平台实现自动测试。  
            Robot rbt = new Robot();  
            Toolkit tk = Toolkit.getDefaultToolkit();  
            Dimension dim = tk.getScreenSize();  
  
            image = rbt.createScreenCapture(new Rectangle(0, 0, (int) dim  
                    .getWidth(), (int) dim.getHeight()));  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
    } 

}

这个代码没有写关闭窗口即退出程序的事件,需要的自己添加。


截图软件的制作仅仅以上三步还远远不够,万里长城我们还只迈了一个台阶,请关注我后续博客。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值