截圖之路01

走着走着你就會發現,曾經的心痛,如今沒什麼大不了--------------路


環境: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();  
        }  
    } 

}

這個代碼沒有寫關閉窗口即退出程序的事件,需要的自己添加。


截圖軟件的製作僅僅以上三步還遠遠不夠,萬里長城我們還只邁了一個臺階,請關注我後續博客。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章