Решение ScreenShot делает снимок экрана моего рабочего стола

В настоящее время я делаю полноэкранную игру и хочу сделать несколько скриншотов. Я нашел этот небольшой фрагмент кода:

BufferedImage image = 
new Robot().createScreenCapture(new Rectangle(w.getX(), w.getY(),w.getWidth(),w.getHeight()));

ImageIO.write(image, "jpg", new File("C:\\Users\\Kaizer\\Desktop\\", "ScreenShot"             + counter + ".jpg"));

Я знаю, что это выглядит некрасиво, но он делает скриншот, но с моего рабочего стола, а не из полноэкранной игры. Скриншоты Windows делают то же самое.

Я знаю, что есть что-то, что я упустил из виду, но я не могу понять это для моей жизни.

Кстати: этот код запускается, когда игрок нажимает кнопку F11. Это не его собственный метод.


person Kaizer    schedule 19.01.2012    source источник


Ответы (2)


Если вы написали свою игру с помощью Swing или AWT, вместо использования Robot вы можете сделать следующее:

private static void captureImage(Component c, String fileName)
        throws IOException {
    BufferedImage img = new BufferedImage(c.getWidth(), c.getHeight(),
            BufferedImage.TYPE_INT_RGB);
    c.paint(img.getGraphics());

    ImageIO.write(img, "jpg", new File(fileName + ".jpg"));
}

Примечание. В зависимости от того, какой Component вы используете, он может быть видимым или нет. Но, учитывая, что вы делаете снимок из игры, я почти уверен, что это не имеет значения.

person Jeffrey    schedule 20.01.2012
comment
Я попробую поиграться с этим. но какой компонент потребуется? настоящий JFrame? - person Kaizer; 20.01.2012
comment
РЕДАКТИРОВАТЬ ---------------------------- Пробовал это с JFrame, но он просто делает белый экран, подумал, может быть, я используя игнорирование перерисовки и двойную буферизацию, а также функции update() и draw(). Я попытался отключить игнорирование перерисовки перед сохранением изображения, а затем снова включить его после сохранения изображения. но все равно только белый экран. - person Kaizer; 20.01.2012
comment
АГА. Я понял. Мне просто нужно было изменить метод, вызываемый из c.paint, на метод рисования. Огромное спасибо. :) - person Kaizer; 20.01.2012
comment
Теперь он также использует текущую дату для создания имени снимка экрана, поэтому они не будут так легко перезаписывать друг друга. добавив сюда рабочий код, если кто-то не понял, как я это исправил. - person Kaizer; 20.01.2012
comment
попробуйте { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = новый SimpleDateFormat (дд-мм-гг); Строка currDate = sdf.format(cal.getTime()); Скриншот JFrame = s.getFrame(); Screenshot.setIgnoreRepaint(false); BufferedImage img = новое BufferedImage(Screenshot.getWidth(), Screenshot.getHeight(), BufferedImage.TYPE_INT_RGB); рисовать (img.getGraphics ()); ImageIO.write(img, jpg, новый файл(Скриншот+currDate+-+счетчик+.jpg)); счетчик++; Screenshot.setIgnoreRepaint(true); } catch (IOException ex) {обработка ошибок здесь} - person Kaizer; 20.01.2012

с моего рабочего стола, а не из моей полноэкранной игры..

Это типично для Robot (или стандартного программного обеспечения для создания скриншотов ОС), когда игра выполняет активный рендеринг. AFAIU, с этим ничего нельзя поделать (кроме того, сделайте скриншоты камерой телефона).

person Andrew Thompson    schedule 20.01.2012