【问题标题】:Simulate Print Screen under WindowsWindows下模拟打印屏幕
【发布时间】:2013-01-30 10:47:03
【问题描述】:

我知道我们可以用下面的代码模拟打印屏幕:

 robot.keyPress(KeyEvent.VK_PRINTSCREEN);

..但是如何返回一些BufferedImage

我在 Google 上找到了一些名为 getClipboard() 的方法,但 Netbeans 在这个方法上返回了一些错误(找不到符号)。

很抱歉问这个问题,但有人可以告诉我一个工作代码,说明如何从这个键返回按 BufferedImage,然后我可以保存吗?

【问题讨论】:

  • 您可能需要先释放该键,然后才能将 Image 保存到剪贴板,但我不确定。
  • 另请参阅this answer 关于您之前的问题。别再对我们大喊大叫了..

标签: java netbeans bufferedimage awtrobot printscreen


【解决方案1】:

这不一定会给你一个BufferedImage,但它会是一个Image。这利用了Toolkit.getSystemClipboard

final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
if (clipboard.isDataFlavorAvailable(DataFlavor.imageFlavor)) {
  final Image screenshot = (Image) clipboard.getData(DataFlavor.imageFlavor);
  ...
}

如果您真的需要BufferedImage,请尝试以下操作...

final GraphicsConfiguration config
    = GraphicsEnvironment.getLocalGraphicsEnvironment()
          .getDefaultScreenDevice().getDefaultConfiguration();
final BufferedImage copy = config.createCompatibleImage(
    screenshot.getWidth(null), screenshot.getHeight(null));
final Object monitor = new Object();
final ImageObserver observer = new ImageObserver() {

  public void imageUpdate(final Image img, final int flags,
      final int x, final int y, final int width, final int height) {
    if ((flags & ALLBITS) == ALLBITS) {
      synchronized (monitor) {
        monitor.notifyAll();
      }
    }
  }
};
if (!copy.getGraphics().drawImage(screenshot, 0, 0, observer)) {
  synchronized (monitor) {
    try {
      monitor.wait();
    } catch (final InterruptedException ex) { }
  }
}

不过,我真的要问你为什么不直接使用Robot.createScreenCapture

final Robot robot = new Robot();
final GraphicsConfiguration config
    = GraphicsEnvironment.getLocalGraphicsEnvironment()
          .getDefaultScreenDevice().getDefaultConfiguration();
final BufferedImage screenshot = robot.createScreenCapture(config.getBounds());

【讨论】:

  • “我真的要问..” 好问题。显然,OP 假设我们都坐在那里,只关注他们的问题。上一个问题解释说createScreenCapture 会为某些全屏应用程序生成黑色图像。也是一个很好的答案。 +1
  • 首先,感谢您的分析。其次,我真的不知道为什么,但是当我运行您的代码时,我收到以下错误:“SEVERE: null java.lang.NullPointerException”
  • 我认为它来自我的以下代码:"ImageIO.write(copy,"png", file1);",对吗?
  • @user1638875 我不知道,我没有写那个代码。异常的名称不足以让我提供帮助......也许如果你有完整的跟踪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多