`
arison1983
  • 浏览: 27866 次
  • 性别: Icon_minigender_1
  • 来自: 新疆
最近访客 更多访客>>
社区版块
存档分类

Robot 实现屏幕抓图3

阅读更多

第一页   第二页   第三页



如果文件不存在或者你允许覆盖已经存在的文件,监听器就会将捕获的内容保存为一个选择的文件。为了完成这个任务,监听器使用Java的
ImageIO框架选择一个jpeg writer,指定文件作为writer的目标,设置writer的压缩品质为95%,然后把图像写入到文件中。

ImageWriter writer = null;

ImageOutputStream ios = null;

try

{

    // Obtain a writer based o­n 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技术领域。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics