`

Java 实现截图功能——网摘

    博客分类:
  • Java
 
阅读更多
之前实现了Java截屏,现在我进一步的完善,实现了Java截图,提到截图,大家一定会想到QQ中同时按住Ctrl+Alt+A开启截图功能吧,不知道的现在应该也知道了吧,那么就立即登录QQ,同时按住Ctrl+Alt+A体验一下截图功能。哈哈,闲话少说,现在我就为大家介绍一下Java中是如何实现屏幕截图的吧,具体的我就不语言描述了,还是上代码吧,代码注释很详细,一切答案尽在代码中!
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.filechooser.FileSystemView;
/**
* 功能:java截图
* 运行后将当前屏幕截取,并最大化显示。
* 拖拽鼠标,选择自己需要的部分。
* 按Esc键保存图片到桌面,并退出程序。
* 双击鼠标左键,保存图片到桌面,并退出程序
* 点击右上角(没有可见的按钮),退出程序,不保存图片。
* 点击右键,退出程序,不保存图片。
* @author 花新昌
*/
public class SnapshotTest {
public static void main(String[] args) {
  //全屏运行
  RectD rd = new RectD();
  GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment()
    .getDefaultScreenDevice();
  gd.setFullScreenWindow(rd);
}
}
class RectD extends JFrame {
private static final long serialVersionUID = 1L;
int orgx, orgy, endx, endy;//鼠标按下和释放时x、y轴坐标
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();//获得屏幕大小
BufferedImage image;//存储整个屏幕
BufferedImage tempImage;//缓存
BufferedImage saveImage;//保存(截取的区域)
Graphics g;
@Override
public void paint(Graphics g) {
  RescaleOp ro = new RescaleOp(0.8f, 0, null);//构造一个具有所希望的缩放因子和偏移量的新 RescaleOp
  tempImage = ro.filter(image, null);//对源 BufferedImage对象image进行重缩放
  g.drawImage(tempImage, 0, 0, this);
}
public RectD() {
  snapshot();
  setVisible(true);//设置窗口可见
  setSize(d);//最大化窗口
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认关闭方式
  this.addMouseListener(new MouseAdapter() {
   public void mousePressed(MouseEvent e) {
    orgx = e.getX();
    orgy = e.getY();
   }
  });
  this.addMouseMotionListener(new MouseMotionAdapter() {
   public void mouseDragged(MouseEvent e) {
    endx = e.getX();
    endy = e.getY();
    g = getGraphics();
    g.drawImage(tempImage, 0, 0, RectD.this);
    int x = Math.min(orgx, endx);
    int y = Math.min(orgy, endy);
    int width = Math.abs(endx - orgx)+1;
    int height = Math.abs(endy - orgy)+1;
    //加上1,防止width或height为0
    g.setColor(Color.BLUE);
    g.drawRect(x-1, y-1, width+1, height+1);
    //减1,加1都是为了防止图片将矩形框覆盖掉
    saveImage = image.getSubimage(x, y, width, height);
    g.drawImage(saveImage, x, y, RectD.this);
   }
  });
  this.addKeyListener(new KeyAdapter() {
   public void keyReleased(KeyEvent e) {
    //按Esc键
    if(e.getKeyCode() == 27) {
     if(saveImage!=null){
      saveToFile();//保存图片     
     }
     System.exit(0);//退出
    }
   }
  });
  this.addMouseListener(new MouseListener(){
   @Override
   public void mouseClicked(MouseEvent e) {//单击(双击)组件时调用
    // TODO Auto-generated method stub
    //双击鼠标左键
    if(e.getClickCount()==2){
     if(saveImage!=null){//如果截图了则保存图片到桌面
      saveToFile();     
     }
     System.exit(0);//退出
    }
   }
   @Override
   public void mouseEntered(MouseEvent e) {//进入组件时调用
    // TODO Auto-generated method stub
   
   }
   @Override
   public void mouseExited(MouseEvent e) {//离开组件时调用
    // TODO Auto-generated method stub
   
   }
   @Override
   public void mousePressed(MouseEvent e) {//在组件上按下鼠标按键时调用
    // TODO Auto-generated method stub
    //点击鼠标右键则退出程序
    if(e.getModifiers()==MouseEvent.BUTTON3_MASK){
     System.exit(0);
    }
   }
   @Override
   public void mouseReleased(MouseEvent e) {//在组件上释放鼠标按钮时调用
    // TODO Auto-generated method stub
   
   }  
  });
}
//保存图片到桌面,图片名称格式为yyyymmddHHmmss.jpg
public void saveToFile() {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
  String name = sdf.format(new Date());//格式转化获得图片名
  File path = FileSystemView.getFileSystemView().getHomeDirectory();//获得桌面路径
  String format = "jpg";
  File f = new File(path + File.separator + name + "." + format);
  try {
   ImageIO.write(saveImage, format, f);//生成图片
  } catch (IOException e) {//抛出异常
   e.printStackTrace();
  }
}
public void snapshot() {
  try {
   Robot robot = new Robot();//在基本屏幕坐标系中构造一个 Robot对象
   Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
   image = robot.createScreenCapture(new Rectangle(0, 0, d.width,d.height));//获得整个屏幕
  } catch (AWTException e) {
   e.printStackTrace();
  }
}
}
分享到:
评论

相关推荐

    Java 网摘 经典的总结

    Java 网摘 Java 网摘 经典的总结 Java 网摘 经典的总结

    Java学习必得(网摘)

    此为一份word文档的资料,是关于Java学习范围的总结。

    网摘集合网摘集合网摘集合网摘集合

    网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合网摘集合...

    天空网摘 v20110624.rar

    “天空网摘”程序分为免费共享版和80元付费后台功能完整版(包含数据更新服务),前者对于正常的网站管理已经足够用的,后者主要在于管理功能细节上的完善。 适用范围新闻娱乐、专业学术、地方门户、行业资讯等相关...

    JAVA面试陷阱(网摘)

    JAVA面试陷阱是本人从网上摘得,为了换点资源分

    天空网摘 V120606.rar

    目标 利用网摘建站,打造最便捷的资讯服务!最适合于做小型SEO网站。 适用范围 新闻娱乐、专业学术、地方门户、行业资讯等相关网站建设。 参考范例:电子书藏家 初始化 注册用户:天空 密码:admin 登录:Login....

    百亿网摘完整无错版

    百亿网摘整站 后台功能 --------------------- 基本信息 管理站点的基本信息 栏目管理 栏目分类 网摘管理 已推荐网摘 推荐网摘 首页生成 重新生成页面 审核网摘 管理网摘 模版管理 模版管理 用户管理 管理员修改 ...

    网摘精灵软件包1.5

    网摘自动提交工具 网摘精灵教程:网摘自动提交工具。 尊敬的站长:你好。 我们注意到您的网站放置了很多网摘提交代码。 你希望通过提交网摘来获取流量,对吗? 靠这种原始的手工提交,效率很低,对吗? 如果有...

    天空网摘 v120606

    “天空网摘”程序分为免费共享版和80元付费后台功能完整版(包含数据更新服务),前者对于正常的网站管理已经足够用的,后者主要在于管理功能细节上的完善。 利用网摘建站,打造最便捷的资讯服务!最适合于做小型...

    PHP免费网摘程序

    2、修改数据库配置文件,conn.php.修改网摘配置文件 include/setup.php。 3、后台路径admin/default.php 默认帐号密码 是 admin admin . 4、生成所有网摘静态页面程序为data.php。生成所有新网摘的程序为 datanew....

    PHP免费网摘程序(源代码)

    2、修改数据库配置文件,conn.php.修改网摘配置文件 include/setup.php。 3、后台路径admin/default.php 默认帐号密码 是 admin admin . 4、生成所有网摘静态页面程序为data.php。生成所有新网摘的程序为 datanew....

    咖啡屋网摘联盟程序 v6.0 终极无错误版

    大家盼望已久的功能终于推出了,带有注册的功能,相当于一个完整的网摘,此次改动较大,加入了大家强烈要求的注册互动功能,成为了一个不仅仅能,而且能摘网摘.

    麦布网摘 v1.1

    麦布网摘是专门为个人站长制作的一个网摘程序,前台主要是分类显示功能,后台有手工添加、修改、删除以及分类的管理,功能比较简单,非常适合二次开发,本系统秉承麦布程序的一贯风格,特点速度快、占用服务器资源小...

    博客、相册、文件、网摘、迷你博客、论坛、活动、圈子

    结合博客、相册、文件、网摘、迷你博客、论坛、活动、圈子、资讯等应用模块,可以快速的搭建具有SNS特征的在线社区。借助SpaceBuilder平台的服务(用户、朋友、私信、邀请、权限、审核、隐私、积分、通知、动态、...

    9426网摘1.0版

    9426网摘1.0版修改之265key网摘增加了如下功能: 1.生成静态首页; 2.增强了防sql注入安全性(文件为根目录下的sqlin.asp,把它包含在你认为需要防注入的页面); 3.增强管理帐号的功能,可以在后台增加管理员; 4.备份...

    23个收藏到网摘的16x16图标及代码

    23个收藏到网摘的16x16图标及代码

    麦布简易网摘源码asp版v1.1

    麦布简易网摘是专门为个人站长制作的一个网摘程序,前台主要是分类显示功能,后台有手工添加、修改、删除以及分类的管理,功能比较简单,非常适合二次开发,本系统秉承麦布程序的一贯风格,特点速度快、占用服务器...

    加入网摘插件 v1.0 通用版

    把网站的页面加入网摘站,可以宣传和推广网站,可以给网站带来一定的流量和人气。特别适用于论坛、文章系统、新闻系统和Blog。程序采用很漂亮的下拉菜单效果,既美观又节省页面空间。

    jsp网摘系统源代码

    jsp网摘系统源代码 jsp网摘系统源代码 jsp网摘系统源代码 jsp网摘系统源代码

Global site tag (gtag.js) - Google Analytics