#1 楼
信不信由你,您实际上可以使用java.awt.Robot
“创建包含从屏幕读取的像素的图像”。然后,您可以将该映像写入磁盘上的文件。我刚刚尝试过,整个过程最终如下:
注意:这只会捕获主监视器。有关多显示器支持,请参见GraphicsConfiguration。
评论
我想知道这是否是Elluminate(elluminate.com)等屏幕共享应用程序使用的东西。
–克里斯·瓦格纳(Chris Wagner)
2010-4-22在22:25
@java_enthu实际上是的,如果您要在应用程序中硬编码屏幕截图的路径,则无需控制台即可使用。
–德米特里(Dmitry Zagorulkin)
2012年8月27日13:56
机械手在屏幕截图中不包括鼠标。是否有类似的功能完全相同,但是鼠标是否包括在内?
– nullUser
2013年6月27日15:14
有没有办法捕获鼠标光标?
– Mehdi Karamosly
13年8月20日在2:12
#2 楼
我从不喜欢使用Robot,所以我制作了自己的简单方法来制作JFrame对象的屏幕截图: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();
}
}
评论
为什么您不喜欢机器人?
–西蒙·福斯伯格
2012年6月12日下午6:22
只是将其视为品味问题。
– DejanLekic
13年9月9日在11:34
即使在拍摄屏幕快照之前目标窗口被遮盖,这似乎也应该具有工作的优势。
–布拉德·梅斯(Brad Mace)
2014年7月28日14:33
另一方面,这仅获取窗口的内容,而使用Robot还可获取窗口的框架和标题栏。
–布拉德·梅斯(Brad Mace)
2014年7月28日在15:57
对于HiDPI(Mac视网膜)显示屏,这将以半分辨率创建屏幕截图。要在argFrame.paint(bufferedImage.getGraphics())调用之前修复那个bufferedImage.getGraphics()。scale(2,2)并使用新的BufferedImage(rec.width * 2,rec.height * 2,BufferedImage.TYPE_INT_ARGB)创建BufferedImage
– nyholku
17年8月4日在6:44
#3 楼
如果要捕获所有监视器,则可以使用以下代码: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);
评论
这样计算会更好
–布拉德·梅斯(Brad Mace)
2014年7月15日19:39
#4 楼
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));
}
#5 楼
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();
}
}
评论
我做了一个基准测试,这是最慢的,也有最大的损失和最大的文件大小。抱歉,
–利亚姆·拉森(Liam Larsen)
17年7月1日在8:47
#6 楼
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将包含完整的屏幕截图,已在三台显示器上进行了测试
#7 楼
您可以使用java.awt.Robot
来完成此任务。下面是服务器的代码,它会将捕获的屏幕截图保存为目录中的图像。 />这是在线程上运行的客户端代码,几分钟后它正在捕获用户屏幕的屏幕截图。
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();
}
}
}
#8 楼
工具箱基于PPI返回像素,因此,在Windows中使用PPI> 100%时,不会为整个屏幕创建屏幕截图。我建议这样做:
/>
评论
web.archive.org/web/20090204074007/http://schmidt.devlib.org/…由于这个问题,我在博客上为绝对初学者编写了一个教程:thepcwizard.in/2012/12/java-screen-capturing-tutorial.html