2011-12-25 19 views
6

Có thể sử dụng Java để có được ảnh chụp màn hình của ứng dụng bên ngoài Java hay không, nói VLC/Windows Media Player, lưu trữ nó như một đối tượng Hình ảnh và sau đó hiển thị nó trong một JLabel hoặc một cái gì đó có tính chất tương tự? Có ai biết nếu điều này là có thể và nếu như vậy không ai có một ý tưởng chung như thế nào để làm điều đó?Làm thế nào để có được ảnh chụp màn hình của bất kỳ ứng dụng Linux/Windows nào đang chạy bên ngoài JVM

Lưu ý: Tôi chỉ cần tìm hiểu cách lấy ảnh chụp màn hình và lưu nó dưới dạng một số đối tượng Hình ảnh. Sau đó tôi có thể sử dụng, thao tác, hiển thị nó, v.v.

Trả lời

3

Dưới đây là câu trả lời dành cho Windows (không chắc chắn nếu alt + printScr hoạt động trên Linux: P)

Tôi đoán một cách để đạt được điều này

1. sử dụng lớp Robot bắn alt + printScreen Command (thao tác này ghi lại cửa sổ đang hoạt động vào khay nhớ tạm)

2. đọc khay nhớ tạm!

Dưới đây là hai đoạn mã thực hiện điều đó. Tôi đã không thực sự cố gắng, nhưng một cái gì đó mà tôi ghép nối với nhau.

Mã để cháy lệnh để có được cửa sổ đang hoạt động trên vào clipboard

import java.awt.AWTException; 
import java.awt.Robot; 
import java.awt.event.KeyEvent; 

public class ActiveWindowScreenShot 
{ 
/** 
    * Main method 
    * 
    * @param args (not used) 
    */ 
public static void main(String[] args) 
{ 
    Robot robot; 

    try { 
    robot = new Robot(); 
    } catch (AWTException e) { 
    throw new IllegalArgumentException("No robot"); 
    } 

    // Press Alt + PrintScreen 
    // (Windows shortcut to take a screen shot of the active window) 
    robot.keyPress(KeyEvent.VK_ALT); 
    robot.keyPress(KeyEvent.VK_PRINTSCREEN); 
    robot.keyRelease(KeyEvent.VK_PRINTSCREEN); 
    robot.keyRelease(KeyEvent.VK_ALT); 

    System.out.println("Image copied."); 
} 
} 

Mã để đọc hình ảnh trên clipboard của

// If an image is on the system clipboard, this method returns it; 
// otherwise it returns null. 
public static Image getClipboard() { 
    Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); 

    try { 
     if (t != null && t.isDataFlavorSupported(DataFlavor.imageFlavor)) { 
      Image text = (Image)t.getTransferData(DataFlavor.imageFlavor); 
      return text; 
     } 
    } catch (UnsupportedFlavorException e) { 
    } catch (IOException e) { 
    } 
    return null; 
} 

Bạn có thể quản lý việc kiểm soát như bạn cần đến! Hãy cho tôi biết, nếu việc này giúp ích cho bạn. nhưng điều này chắc chắn là trên todo của tôi để thử nó ra!

+0

Wow! Tôi chưa bao giờ nghĩ đến việc này. Tốt công việc giao phối, tôi sẽ thử nó cho chắc chắn. Giáng sinh vui vẻ! –

+0

Giáng sinh vui vẻ! Hãy thử và cho biết nếu nó hoạt động! Một số làm thế nào 'không thể được thực hiện trong java' nghe quá khắc nghiệt với đôi tai của tôi! : P – Shaunak

+0

Không thể tin rằng tôi đã nghĩ về điều này bằng cách bạn có thể nhận được bao nhiêu khung hình mỗi giây. – user4090

2

Bạn có thể chụp toàn màn hình bằng cách sử dụng lớp có tên Robot. Thật không may, bạn không thể có được vị trí và kích thước của các cửa sổ thuộc về các ứng dụng khác sử dụng giải pháp java thuần túy. Để làm điều này bạn cần các công cụ khác (scripting, JNI, JNA). Những công cụ này không phải là nền tảng chéo.

+0

Cảm ơn bạn đời. Bạn có bất kỳ đề xuất nào cho đến mức có thể làm những gì tôi muốn là nhanh nhất, dễ nhất và mạnh mẽ nhất không? Tôi có một chút kinh nghiệm C nếu đó là bất kỳ sử dụng? Tôi lo lắng chờ đợi câu trả lời của bạn. –

+0

Hey tại sao không cho câu trả lời của tôi một thử! : P – Shaunak

+0

@ Alex: Bạn nghĩ gì về câu trả lời của tôi bên dưới? – Shaunak