`

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学习路径的一个全面概述。以下将详细讲解其中提到的关键知识点: 1. **语法理解**:Java语法是编程的基础,熟悉并能理解错误...

    Java 网摘 经典的总结

    【Java 网摘经典总结】 Java 网摘中提到的核心知识点主要集中在Socket编程上,这是Java进行网络通信的基础。Socket,又称“套接字”,是计算机网络中进程间通信的一种方式,它允许两个网络应用程序之间进行双向通信...

    JAVA面试陷阱(网摘)

    【JAVA面试陷阱详解】 在Java面试中,面试官常常会设置一些陷阱问题,考察候选人的基础知识和理解深度。以下是一些常见的陷阱问题及其解析: 1. **final, finally, finalize的区别** - `final`:这是一个修饰符,...

    天空网摘 v20110624.rar

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

    php网摘程序

    通过访问演示地址(http://www.pictop.com/zhai/),我们可以实际体验该PHP网摘程序的运行效果,观察其功能实现和界面设计。尽管提供的压缩包文件名为"zhai",但未提供具体文件内容,我们无法深入探讨源代码细节。...

    天空网摘 V120606.rar

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

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

    这款插件的核心功能是使用户能够方便地将网站内容添加到他们的网络收藏夹或网摘站点,从而促进网站的宣传和推广。尤其对于论坛、文章系统、新闻平台以及博客等互动性强的网站类型,它能显著增加网站流量和用户粘性。...

    百亿网摘完整无错版

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

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

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

    网摘精灵软件包1.5

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

    天空网摘 v120606

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

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

    《咖啡屋网摘联盟程序 v6.0 终极无错误版》正是在这样的背景下应运而生,它不仅为用户提供了一个便捷的网摘分享平台,更是将社交化功能融入到知识管理之中,让用户在收集和整理网页资源的同时,也能享受到交流互动的...

    PHP免费网摘程序

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

    jsp网摘系统源代码

    【JSP网摘系统源代码】是一个基于Java技术开发的Web应用程序,主要使用JSP(JavaServer Pages)作为视图层技术,为用户提供一个在线收藏、管理和分享网络资源的平台。这种系统通常包括用户注册、登录、添加摘录、...

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

    在这里,图标可能是用于表示收藏功能的图形元素,而代码则可能包含了实现这些图标在网页上动态显示的方法。 在IT领域,图标设计是一个关键的组成部分,特别是在UI/UX设计中。16x16像素的图标因为其小巧的体积,常被...

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

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

    CSDN网摘右链添加

    描述中提到的"导入注册表后右链添加网摘"是指通过操作系统的注册表编辑器(Regedit)来实现这一功能。注册表是Windows系统中存储配置信息的重要数据库,它记录了系统和应用程序的各种设置。用户可以通过导入`.reg`...

    PW广告添加方式网摘插件

    网摘插件则是这类服务的一种扩展,它使得网站管理员可以在自己的平台上集成网摘功能,让用户在浏览网站的同时能够方便地保存、分享感兴趣的内容。结合广告功能,网摘插件可以提供一个互动的平台,不仅提高了用户体验...

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

    标签“代码”表明这个压缩包内包含编程相关的文件,可能是HTML、CSS或者JavaScript代码,这些代码与图标的功能实现紧密相关。HTML用于构建网页的基本结构,CSS负责样式设计,而JavaScript则常用于实现动态交互,如...

Global site tag (gtag.js) - Google Analytics