Swing屏幕截图工具 Swing Screen Capture 之二,实现QQ屏幕截图

 

前几天的截图工具其实跟QQ的原理不一样,QQ的截图给人感觉是在按下截图按钮之后界面会冻结,界面怎么可能冻结呢?这里一样用了一个全屏的程序,并把按下按钮之前的屏幕截图,作为全屏程序的背景,这样就给人感觉屏幕以冻结。可能你会问,那这个时候如果我按ALT+TAB切换呢,呵呵,QQ把这个程序作为AlwaysOnTop的了,这样就算你切换完了,还是全屏显示这个冻结的画面。 上次做的感觉原理跟QQ的各有千秋吧,QQ这个就像相机,按下快门就已经截图了,只是后面再在截的图上面做裁剪,而上次的那个是动态的,你先取好景,支好三脚架,然后静待美景的出现,再按下快门。 这里我也修改了一下上次的代码,做了个Java版的QQ截图工具,开始截图之前会先通过Robot截取整个屏幕,然后再通过CropImageFilter对图片做裁剪,裁剪代码如下:

     Image captureImage = null;
     ImageFilter cropFilter;
     cropFilter = new CropImageFilter(pn.x,pn.y,pn.width,pn.height);//四个参数分别为图像起点坐标和宽高,即CropImageFilter(int x,int y,int width,int height),详细情况请参考API

     captureImage = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
网上搜索了一下java 图片裁剪,结果少的可怜,看来这个类被人并不常用啊。不过换成从BufferedImage裁剪到Image以后确出了问题,Image不能直接调用ImageIO输出图片了,后面又折腾了半天,把Image又转换会BufferedImage,再保存,晕了,似乎也没什么好的办法了,认了吧。 BufferedImage转Image代码:
      BufferedImage bufferedImage = new BufferedImage(captureImage.getWidth(null), captureImage.getHeight(null), BufferedImage.TYPE_INT_RGB);
     Graphics2D g = bufferedImage.createGraphics();
     g.drawImage(captureImage, null, null);

  • 主屏幕截图:
  • 截图结果:

2 评论:

匿名 说...

哈哈,在linux上全屏是否出问题?
我始终没解决这个问题。

阿福 说...

Linux下面没试过啊,不过应该是不一样的,你所说的全屏是指的程序无法盖住整个屏幕么?