第一页 第二页 第三页
如果文件不存在或者你允许覆盖已经存在的文件,监听器就会将捕获的内容保存为一个选择的文件。为了完成这个任务,监听器使用Java的
ImageIO框架选择一个jpeg writer,指定文件作为writer的目标,设置writer的压缩品质为95%,然后把图像写入到文件中。
ImageWriter writer = null; ImageOutputStream ios = null; try { // Obtain a writer based on the jpeg format. Iterator iter; iter = ImageIO.getImageWritersByFormatName ("jpeg"); // Validate existence of writer. if (!iter.hasNext ()) { showError ("Unable to save image to jpeg file type."); return; } // Extract writer. writer = (ImageWriter) iter.next(); // Configure writer output destination. ios = ImageIO.createImageOutputStream (file); writer.setOutput (ios); // Set jpeg compression quality to 95%. ImageWriteParam iwp = writer.getDefaultWriteParam (); iwp.setCompressionMode (ImageWriteParam.MODE_EXPLICIT); iwp.setCompressionQuality (0.95f); // Write the image. writer.write (null, new IIOImage ((BufferedImage) ia.getImage (), null, null), iwp); } catch (IOException e2) { showError (e2.getMessage ()); } finally { try { // Cleanup. if (ios != null) { ios.flush (); ios.close (); } if (writer != null) writer.dispose (); } catch (IOException e2) { } }
让代码自己清理一直是一个不错的主意。我把ImageIO的清理代码放在了finally子句中,以至于无论是正常结束还是抛出异常,它都可以执行。
总结
Capture限制了捕获的内容只能在主屏幕设备内。你可能想增强Capture来捕获所有附加屏幕设备(或许是一个巨大的虚拟屏幕)的内容。增强之一,你需要包含下面的代码,它捕获所有屏幕的内容,将它和Capture.java已经存在的代码集成。
GraphicsEnvironment graphenv = GraphicsEnvironment.getLocalGraphicsEnvironment (); GraphicsDevice [] screens = graphenv.getScreenDevices (); BufferedImage [] captures = new BufferedImage [screens.length]; for (int i = 0; i < screens.length; i++) { DisplayMode mode = screens [i].getDisplayMode (); Rectangle bounds = new Rectangle (0, 0, mode.getWidth (), mode.getHeight ()); captures [i] = new Robot (screens [i]).createScreenCapture (bounds); }
把以上代码放到Capture菜单项的动作监听器内。然后先引入代码创建一个bigScreen要引用的足够大的
BufferedImage,它可以保存被captures数组引用的所有BufferedImage内容;接着引入代码把它们的绘制到
bigScreen中。Capture现在成为了多屏幕捕获器就好像是一个单屏幕捕获器。
关于作者
Jeff Friesen是一个自由软件开发者和教育家,特别是在C、C++和Java技术领域。