2008-09-12 5 views
110

Einfach wie der Titel sagt: Können Sie nur Java-Befehle verwenden, um einen Screenshot zu erstellen und zu speichern? Oder muss ich ein OS-spezifisches Programm verwenden, um den Screenshot aufzunehmen und ihn dann aus der Zwischenablage zu ziehen?Gibt es eine Möglichkeit, einen Screenshot mit Java zu erstellen und in einer Art Bild zu speichern?

+0

Ich wusste nie, dass es so einfach wäre. – jjnguy

+2

Dank dieser Frage schrieb ich ein Tutorial für absolute Anfänger auf meinem Blog: http://www.thepcwizard.in/2012/12/java-screen-capturing-tutorial.html – ThePCWizard

+0

http://web.archive.org /web/20090204074007/http://schmidt.devlib.org/java/save-screenshot.html –

Antwort

163

Ob Sie es glauben oder nicht, können Sie tatsächlich java.awt.Robot verwenden, um "ein Bild zu erstellen, das Pixel enthält, die vom Bildschirm gelesen werden." Sie können dieses Bild dann in eine Datei auf der Festplatte schreiben.

Ich habe gerade versucht es, und das Ganze endet wie:

Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
BufferedImage capture = new Robot().createScreenCapture(screenRect); 
ImageIO.write(capture, "bmp", new File(args[0])); 

Hinweis: Dies wird nur den primären Monitor erfassen. Siehe GraphicsConfiguration für die Unterstützung mehrerer Monitore.

+4

Ich würde nie java.awt.Robot finden. Das ist eine beeindruckende und nützliche Klasse. –

+1

Ich frage mich, ob dies Screen-Sharing-Anwendungen wie Elluminate (http://www.elluminate.com/) verwenden. –

+1

Funktioniert es auch, wenn ich keine Konsole habe? –

20

Ich mochte nie Roboter verwenden, so dass ich meine eigene einfache Methode für Screenshots von JFrame Objekte machen:

public static final void makeScreenshot(JFrame argFrame) { 
    Rectangle rec = argFrame.getBounds(); 
    BufferedImage bufferedImage = new BufferedImage(rec.width, rec.height, BufferedImage.TYPE_INT_ARGB); 
    argFrame.paint(bufferedImage.getGraphics()); 

    try { 
     // Create temp file 
     File temp = File.createTempFile("screenshot", ".png"); 

     // Use the ImageIO API to write the bufferedImage to a temporary file 
     ImageIO.write(bufferedImage, "png", temp); 

     // Delete temp file when program exits 
     temp.deleteOnExit(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 
+15

Gibt es einen Grund warum Sie Robot nicht mögen? –

+0

Denken Sie einfach an Geschmack. – DejanLekic

+2

Es sieht so aus, als hätte dies den Vorteil, dass es funktioniert, auch wenn das Zielfenster verdeckt ist, bevor der Screenshot gemacht wird. –

8
public void captureScreen(String fileName) throws Exception { 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    Rectangle screenRectangle = new Rectangle(screenSize); 
    Robot robot = new Robot(); 
    BufferedImage image = robot.createScreenCapture(screenRectangle); 
    ImageIO.write(image, "png", new File(fileName)); 
} 
16

Wenn Sie alle Monitore erfassen möchten, können Sie den folgenden Code verwenden :

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice[] screens = ge.getScreenDevices(); 

Rectangle allScreenBounds = new Rectangle(); 
for (GraphicsDevice screen : screens) { 
    Rectangle screenBounds = screen.getDefaultConfiguration().getBounds(); 

    allScreenBounds.width += screenBounds.width; 
    allScreenBounds.height = Math.max(allScreenBounds.height, screenBounds.height); 
} 

Robot robot = new Robot(); 
BufferedImage screenShot = robot.createScreenCapture(allScreenBounds); 
+3

zu erstellen, wäre besser, sie [auf diese Weise] (http://stackoverflow.com) zu berechnen/a/13380999/446591) –

3
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class HelloWorldFrame extends JFrame implements ActionListener { 

JButton b; 
public HelloWorldFrame() { 
    this.setVisible(true); 
    this.setLayout(null); 
    b = new JButton("Click Here"); 
    b.setBounds(380, 290, 120, 60); 
    b.setBackground(Color.red); 
    b.setVisible(true); 
    b.addActionListener(this); 
    add(b); 
    setSize(1000, 700); 
} 
public void actionPerformed(ActionEvent e) 
{ 
    if (e.getSource() == b) 
    { 
     this.dispose(); 
     try { 
      Thread.sleep(1000); 
      Toolkit tk = Toolkit.getDefaultToolkit(); 
      Dimension d = tk.getScreenSize(); 
      Rectangle rec = new Rectangle(0, 0, d.width, d.height); 
      Robot ro = new Robot(); 
      BufferedImage img = ro.createScreenCapture(rec); 
      File f = new File("myimage.jpg");//set appropriate path 
      ImageIO.write(img, "jpg", f); 
     } catch (Exception ex) { 
      System.out.println(ex.getMessage()); 
     } 
    } 
} 

public static void main(String[] args) { 
    HelloWorldFrame obj = new HelloWorldFrame(); 
} 
} 
+0

Ich habe einen Benchmark gemacht und dieser ist der langsamste, hat auch den größten Verlust und die größte Dateigröße. Es tut uns leid, –

2
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice[] screens = ge.getScreenDevices();  
Rectangle allScreenBounds = new Rectangle(); 
for (GraphicsDevice screen : screens) { 
     Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();   
     allScreenBounds.width += screenBounds.width; 
     allScreenBounds.height = Math.max(allScreenBounds.height, screenBounds.height); 
     allScreenBounds.x=Math.min(allScreenBounds.x, screenBounds.x); 
     allScreenBounds.y=Math.min(allScreenBounds.y, screenBounds.y); 
     } 
Robot robot = new Robot(); 
BufferedImage bufferedImage = robot.createScreenCapture(allScreenBounds); 
File file = new File("C:\\Users\\Joe\\Desktop\\scr.png"); 
if(!file.exists()) 
    file.createNewFile(); 
FileOutputStream fos = new FileOutputStream(file); 
ImageIO.write(bufferedImage, "png", fos); 

bufferedIma ge enthält einen vollständigen Screenshot, dieser wurde mit drei Monitoren getestet

0

Sie können java.awt.Robot verwenden, um diese Aufgabe zu erfüllen.

Unten ist der Code des Servers, der den aufgenommenen Screenshot als Bild in Ihrem Verzeichnis speichert.

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketTimeoutException; 
import java.sql.SQLException; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import javax.imageio.ImageIO; 

public class ServerApp extends Thread 
{ 
     private ServerSocket serverSocket=null; 
     private static Socket server = null; 
     private Date date = null; 
     private static final String DIR_NAME = "screenshots"; 

    public ServerApp() throws IOException, ClassNotFoundException, Exception{ 
     serverSocket = new ServerSocket(61000); 
     serverSocket.setSoTimeout(180000); 
    } 

public void run() 
    { 
     while(true) 
     { 
      try 
      { 
       server = serverSocket.accept(); 
       date = new Date(); 
        DateFormat dateFormat = new SimpleDateFormat("_yyMMdd_HHmmss"); 
       String fileName = server.getInetAddress().getHostName().replace(".", "-"); 
       System.out.println(fileName); 
       BufferedImage img=ImageIO.read(ImageIO.createImageInputStream(server.getInputStream())); 
       ImageIO.write(img, "png", new File("D:\\screenshots\\"+fileName+dateFormat.format(date)+".png")); 
       System.out.println("Image received!!!!"); 
       //lblimg.setIcon(img); 
      } 
     catch(SocketTimeoutException st) 
     { 
       System.out.println("Socket timed out!"+st.toString()); 
//createLogFile("[stocktimeoutexception]"+stExp.getMessage()); 
        break; 
      } 
      catch(IOException e) 
      { 
        e.printStackTrace(); 
        break; 
     } 
     catch(Exception ex) 
     { 
       System.out.println(ex); 
     } 
     } 
    } 

    public static void main(String [] args) throws IOException, SQLException, ClassNotFoundException, Exception{ 
      ServerApp serverApp = new ServerApp(); 
      serverApp.createDirectory(DIR_NAME); 
      Thread thread = new Thread(serverApp); 
      thread.start(); 
    } 

private void createDirectory(String dirName) { 
    File newDir = new File("D:\\"+dirName); 
    if(!newDir.exists()){ 
     boolean isCreated = newDir.mkdir(); 
    } 
} 
} 

Und das ist Client-Code, der auf Thread ausgeführt wird und nach einigen Minuten wird es den Screenshot von Benutzern Bildschirm zu erfassen.

package com.viremp.client; 

import java.awt.AWTException; 
import java.awt.Dimension; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.Socket; 
import java.util.Random; 

import javax.imageio.ImageIO; 

public class ClientApp implements Runnable { 
    private static long nextTime = 0; 
    private static ClientApp clientApp = null; 
    private String serverName = "192.168.100.18"; //loop back ip 
    private int portNo = 61000; 
    //private Socket serverSocket = null; 

    /** 
    * @param args 
    * @throws InterruptedException 
    */ 
    public static void main(String[] args) throws InterruptedException { 
     clientApp = new ClientApp(); 
     clientApp.getNextFreq(); 
     Thread thread = new Thread(clientApp); 
     thread.start(); 
    } 

    private void getNextFreq() { 
     long currentTime = System.currentTimeMillis(); 
     Random random = new Random(); 
     long value = random.nextInt(180000); //1800000 
     nextTime = currentTime + value; 
     //return currentTime+value; 
    } 

    @Override 
    public void run() { 
     while(true){ 
      if(nextTime < System.currentTimeMillis()){ 
       System.out.println(" get screen shot "); 
       try { 
        clientApp.sendScreen(); 
        clientApp.getNextFreq(); 
       } catch (AWTException e) { 
        // TODO Auto-generated catch block 
        System.out.println(" err"+e); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch(Exception e){ 
        e.printStackTrace(); 
       } 

      } 
      //System.out.println(" statrted ...."); 
     } 

    } 

    private void sendScreen()throws AWTException, IOException { 
      Socket serverSocket = new Socket(serverName, portNo); 
      Toolkit toolkit = Toolkit.getDefaultToolkit(); 
      Dimension dimensions = toolkit.getScreenSize(); 
       Robot robot = new Robot(); // Robot class 
       BufferedImage screenshot = robot.createScreenCapture(new Rectangle(dimensions)); 
       ImageIO.write(screenshot,"png",serverSocket.getOutputStream()); 
       serverSocket.close(); 
    } 
} 
Verwandte Themen