标题简单说明:您是否可以仅使用Java命令截取屏幕并保存?或者,我是否需要使用特定于操作系统的程序来截取屏幕截图然后将其从剪贴板中取出?
编辑:如果任何人还有任何其他建议,以提高屏幕捕获性能,请随意分享,因为它可能完全解决我的问题!
你好开发者,
我正在为自己制作一些基本的屏幕捕获软件.截至目前,我已经获得了一些概念/修补代码的证明,它使用java.awt.Robot将屏幕捕获为BufferedImage.然后我执行此捕获指定的时间,然后将所有图片转储到磁盘.从我的测试中我得到大约每秒17帧.
时长:15秒拍摄的图像:255
时长:15秒图像捕获:229
显然,这对于真正的屏幕捕获应用程序来说还不够好.特别是因为这些捕获只是在我的IDE中选择一些文本而没有任何图形密集的文本.
我现在有两个班级是Main类和一个"Monitor"类.Monitor类包含捕获屏幕的方法.我的Main类有一个基于时间的循环,它调用Monitor类并将它返回的BufferedImage存储到BufferedImages的ArrayList中.如果我修改我的主类来生成几个执行该循环的线程,并且还收集有关捕获图像的系统时间的信息,我可以提高性能吗?我的想法是使用一个共享数据结构,它将在插入时基于捕获时间自动对帧进行排序,而不是将连续图像插入到arraylist中的单个循环.
码:
public class Monitor {
/**
* Returns a BufferedImage
* @return
*/
public BufferedImage captureScreen() {
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage capture = null;
try {
capture = new Robot().createScreenCapture(screenRect);
} catch (AWTException e) {
e.printStackTrace();
}
return capture;
}
}
Run Code Online (Sandbox Code Playgroud)
public class Main {
public static void main(String[] args) throws InterruptedException {
String outputLocation = "C:\\Users\\ewillis\\Pictures\\screenstreamer\\";
String namingScheme = "image";
String mediaFormat = "jpeg";
DiscreteOutput output …Run Code Online (Sandbox Code Playgroud) 我想使用java来使用FFMPEG或其他解决方案截取我的机器的屏幕截图.我知道linux可以在没有JNI的情况下使用ffmpeg,但在Windows中运行它不起作用并且可能需要(JNI?)是否有一些简单的Java类(以及其他任何必要的)的示例来捕获在Windows环境中可运行的屏幕截图?FFMPEG有替代品吗?我想以比Java Robot API更快的速度截取屏幕截图,我发现它可以用来截取屏幕截图,但速度比我想要的慢.
我知道在Linux中它的工作速度非常快:
import com.googlecode.javacv.*;
public class ScreenGrabber {
public static void main(String[] args) throws Exception {
int x = 0, y = 0, w = 1024, h = 768;
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(":0.0+" + x + "," + y);
grabber.setFormat("x11grab");
grabber.setImageWidth(w);
grabber.setImageHeight(h);
grabber.start();
CanvasFrame frame = new CanvasFrame("Screen Capture");
while (frame.isVisible()) {
frame.showImage(grabber.grab());
}
frame.dispose();
grabber.stop();
}
Run Code Online (Sandbox Code Playgroud)
这在Windows环境中不起作用.我不确定是否有某些方法可以使用相同的代码,但使用javacpp实际上可以使其工作,而无需更改上述代码.
目标是快速截取屏幕截图,但在截取"不同"的屏幕截图之后停止.屏幕因某些事件而改变,例如窗口关闭等等.
由于Robot.createScreenCaputure()方法很慢,我决定使用本机库.我搜索并找到了这个论坛,找到了一个使用JNA Library的特定代码snipplet.这是一个旧版本,所以我重写了代码:
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferInt;
import java.awt.image.DataBufferUShort;
import java.awt.image.DirectColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import com.sun.jna.Native;
import com.sun.jna.win32.W32APIOptions;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinGDI;
public class JNAScreenShot {
public static BufferedImage getScreenshot(Rectangle bounds) {
WinDef.HDC windowDC = GDI.GetDC(USER.GetDesktopWindow());
WinDef.HBITMAP outputBitmap =
GDI.CreateCompatibleBitmap(windowDC,
bounds.width, bounds.height);
try {
WinDef.HDC blitDC = GDI.CreateCompatibleDC(windowDC);
try {
WinNT.HANDLE oldBitmap =
GDI.SelectObject(blitDC, outputBitmap);
try {
GDI.BitBlt(blitDC,
0, 0, bounds.width, bounds.height,
windowDC,
bounds.x, …Run Code Online (Sandbox Code Playgroud) Webdriver 2.28会自动截取异常/失败/错误的屏幕截图吗?
如果有,我在哪里可以找到截图?哪个目录是默认的?
我正在使用另一篇 StackOverflow 帖子 - Java - 如何快速截取屏幕截图中的示例代码,但我遇到了一些问题。
我从其Github 存储库下载了 JNA 文件,然后将该文件复制到 JAR 文件中,并将其放入我的程序所在的同一文件夹中。但是当我尝试编译我的程序时,它给了我很多错误,如下所示:
C:\Users\windows\Desktop\testPrintScreen>javac JNAScreenShot.java
JNAScreenShot.java:12: error: package com.sun.jna.platform.win32 does not exist
import com.sun.jna.platform.win32.W32API;
^
JNAScreenShot.java:129: error: package com.sun.jna.platform.win32 does not exist
interface GDI32 extends com.sun.jna.platform.win32.GDI32 {
^
JNAScreenShot.java:58: error: cannot find symbol
bufferedImageFromBitmap(GDI32.HDC blitDC,
^
symbol: class HDC
location: interface GDI32
JNAScreenShot.java:59: error: cannot find symbol
GDI32.HBITMAP outputBitmap,
^
symbol: class HBITMAP
location: interface GDI32
JNAScreenShot.java:60: error: cannot find symbol
GDI32.BITMAPINFO bi) {
^
symbol: class BITMAPINFO …Run Code Online (Sandbox Code Playgroud)