走着走着你就会发现,曾经的心痛,如今没什么大不了--------------路
环境: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();
}
}
}
这个代码没有写关闭窗口即退出程序的事件,需要的自己添加。
截图软件的制作仅仅以上三步还远远不够,万里长城我们还只迈了一个台阶,请关注我后续博客。