/** * This is the top-level screen-capture routine. It sends the resulting PNG image to the location * previously selected by the user. TODO: It currently calls {@link * TabletopTool.takeMapScreenShot()} for "normal" screenshots, but that's just until this code is * considered stable enough. * * @throws Exception */ public void screenCapture() throws Exception { BufferedImage screenCap = null; TabletopTool.getFrame() .setStatusMessage(I18N.getString("dialog.screenshot.msg.GeneratingScreenshot")); ExportRadioButtons type = ExportRadioButtons.getType(); try { switch (type) { case TYPE_CURRENT_VIEW: // This uses the original screenshot code: I didn't want to touch it, so I need // to pass it the same parameter it took before. Player.Role role = ExportRadioButtons.VIEW_GM.isChecked() ? Player.Role.GM : Player.Role.PLAYER; screenCap = TabletopTool.takeMapScreenShot(new PlayerView(role)); // since old screenshot code doesn't throw exceptions, look for null if (screenCap == null) { throw new Exception(I18N.getString("dialog.screenshot.error.failedImageGeneration")); } break; case TYPE_ENTIRE_MAP: screenCap = entireMapScreenShotWithLayers(); break; default: throw new Exception(I18N.getString("dialog.screenshot.error.invalidDialogSettings")); } TabletopTool.getFrame() .setStatusMessage(I18N.getString("dialog.screenshot.msg.screenshotStreaming")); try (ByteArrayOutputStream imageOut = new ByteArrayOutputStream()) { ImageIO.write(screenCap, "png", imageOut); screenCap = null; // Free up the memory as soon as possible TabletopTool.getFrame() .setStatusMessage(I18N.getString("dialog.screenshot.msg.screenshotSaving")); exportLocation.putContent( new BufferedInputStream(new ByteArrayInputStream(imageOut.toByteArray()))); } TabletopTool.getFrame() .setStatusMessage(I18N.getString("dialog.screenshot.msg.screenshotSaved")); } catch (OutOfMemoryError e) { TabletopTool.showError("Out Of Memory", e); } catch (Exception ex) { TabletopTool.showError("screenCapture()", ex); } }