Gibt es eine Möglichkeit, einen Screenshot mit Java zu erstellen und ihn in einer Art Bild zu speichern?

Ganz einfach, wie der Titel sagt: Können Sie nur Java-Befehle verwenden, um einen Screenshot aufzunehmen und zu speichern? Oder muss ich ein OS-spezifisches Programm verwenden, um den Screenshot aufzunehmen und ihn dann aus der Zwischenablage zu ziehen?

Ob Sie es glauben oder nicht, Sie können java.awt.Robot um “ein Bild mit Pixeln zu erstellen, die vom Bildschirm gelesen werden.” Sie können dieses Bild dann in eine Datei auf der Festplatte schreiben.

Ich habe es gerade ausprobiert und die ganze Sache endet wie folgt:

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

HINWEIS: Dadurch wird nur der primäre Monitor erfasst. Siehe GraphicsConfiguration für die Unterstützung mehrerer Monitore.

Ich habe es nie gemocht, Robot zu verwenden, also habe ich meine eigene einfache Methode zum Erstellen von Screenshots von JFrame-Objekten erstellt:

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

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

bufferedImage enthält einen vollständigen Screenshot, der mit drei Monitoren getestet wurde

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

Unten ist der Code des Servers, der den 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 läuft und nach einigen Minuten den Screenshot des Benutzerbildschirms erfasst.

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