`
xiao_yi
  • 浏览: 406071 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用JAVA实现的屏幕抓图

阅读更多
package com.qiu.util;
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;

/**@Author Qiu_BaiChao
*一个简单的屏幕抓图
*
**/

public class ScreenCapture {
//test main
public static void main(String[] args) throws Exception{
  String userdir = System.getProperty("user.dir");
  File tempFile = new File("d:","temp.png");
  ScreenCapture capture = ScreenCapture.getInstance();
  capture.captureImage(); 
  JFrame frame = new JFrame();
  JPanel panel = new JPanel();
  panel.setLayout(new BorderLayout());
  JLabel imagebox = new JLabel();
  panel.add(BorderLayout.CENTER,imagebox); 
  imagebox.setIcon(capture.getPickedIcon());
  capture.saveToFile(tempFile);
  capture.captureImage();
  imagebox.setIcon(capture.getPickedIcon());
  frame.setContentPane(panel);
  frame.setSize(400,300);
  frame.show();
  System.out.println("Over");
}

private ScreenCapture() {
 
  try{
   robot = new Robot();
  }
  catch(AWTException e) {
   System.err.println("Internal Error: " + e);
   e.printStackTrace();
  } 
  JPanel cp = (JPanel)dialog.getContentPane();
  cp.setLayout(new BorderLayout()); 
  labFullScreenImage.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent evn) {
      isFirstPoint = true;
      pickedImage = fullScreenImage.getSubimage(recX,recY,recW,recH);
      dialog.setVisible(false);    
    }
   });
  
  labFullScreenImage.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent evn) {
     if(isFirstPoint) {
      x1 = evn.getX();
      y1 = evn.getY();
      isFirstPoint = false; 
     }
     else {
      x2 = evn.getX();
      y2 = evn.getY();
      int maxX = Math.max(x1,x2);
      int maxY = Math.max(y1,y2);
      int minX = Math.min(x1,x2);
      int minY = Math.min(y1,y2);
      recX = minX;
      recY = minY;
      recW = maxX-minX;
      recH = maxY-minY;
      labFullScreenImage.drawRectangle(recX,recY,recW,recH);   
     }
    }
   
    public void mouseMoved(MouseEvent e) {
     labFullScreenImage.drawCross(e.getX(),e.getY());
    }
   });
  
  cp.add(BorderLayout.CENTER,labFullScreenImage);
  dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
  dialog.setAlwaysOnTop(true);
  dialog.setMaximumSize(
   Toolkit.getDefaultToolkit().getScreenSize());
  dialog.setUndecorated(true);
  dialog.setSize(dialog.getMaximumSize());
  dialog.setModal(true);
}
//Singleton Pattern
public static ScreenCapture getInstance() {
  return defaultCapturer;
}
/**捕捉全屏慕*/
public Icon captureFullScreen() {
  fullScreenImage = robot.createScreenCapture(new Rectangle(
   Toolkit.getDefaultToolkit().getScreenSize()));
  ImageIcon icon = new ImageIcon(fullScreenImage);
  return icon;
}
/**捕捉屏幕的一个矫形区域
  */
public void captureImage() {
  fullScreenImage = robot.createScreenCapture(new Rectangle(
   Toolkit.getDefaultToolkit().getScreenSize()));
  ImageIcon icon = new ImageIcon(fullScreenImage);
  labFullScreenImage.setIcon(icon); 
  dialog.setVisible(true);
}
/**得到捕捉后的BufferedImage*/
public BufferedImage getPickedImage() {
  return pickedImage;
}
/**得到捕捉后的Icon*/
public ImageIcon getPickedIcon() {
  return new ImageIcon(getPickedImage());
}
/**储存为一个文件,为PNG格式
  *@deprecated
  *replaced by saveAsPNG(File file)
  **/
@Deprecated
public void saveToFile(File file) throws IOException{
  ImageIO.write(getPickedImage(),defaultImageFormater,file);
}
/**储存为一个文件,为PNG格式*/
public void saveAsPNG(File file) throws IOException {
  ImageIO.write(getPickedImage(),"png",file);
}
/**储存为一个JPEG格式图像文件*/
public void saveAsJPEG(File file) throws IOException {
  ImageIO.write(getPickedImage(),"JPEG",file);
}

/**写入一个OutputStream*/
public void write(OutputStream out) throws IOException{
  ImageIO.write(getPickedImage(),defaultImageFormater,out);
}

//singleton design pattern
private static ScreenCapture defaultCapturer = new ScreenCapture();
private int x1,y1,x2,y2;
private int recX,recY,recH,recW; //截取的图像
private boolean isFirstPoint  = true;
private BackgroundImage labFullScreenImage = new BackgroundImage();
private Robot robot;
private BufferedImage fullScreenImage;
private BufferedImage pickedImage;
private String defaultImageFormater = "png";
private JDialog dialog = new JDialog();
}

/**显示图片的Label*/
class BackgroundImage extends JLabel{
public void paintComponent(Graphics g) {
  super.paintComponent(g);
  g.drawRect(x,y,w,h);
  String area = Integer.toString(w)+" * "+ Integer.toString(h);
  g.drawString(area,x+(int)w/2-15,y+(int)h/2);
  g.drawLine(lineX,0,lineX,getHeight());
  g.drawLine(0,lineY,getWidth(),lineY);
}

public void drawRectangle(int x,int y,int width,int height) {
  this.x = x;
  this.y = y;
  h = height;
  w = width;
  repaint();
}

public void drawCross(int x,int y) {
  lineX = x;
  lineY = y;
  repaint();
}

int lineX,lineY;
int x,y,h,w;
}

分享到:
评论
3 楼 paofan 2007-12-21  
不错,很好用,关键是可以扩展。
2 楼 xiao_yi 2007-12-21  
实践出真知哈...
1 楼 scar 2007-12-20  
网页抓屏可以实现吗?

相关推荐

    一个简单的用JAVA实现的屏幕抓图(源代码)

    根据给定的文件信息,我们可以总结出以下关于使用Java实现屏幕截图的重要知识点: ### Java屏幕抓图技术概览 在Java中,实现屏幕抓图主要依赖于`java.awt.Robot`类,它提供了屏幕捕获的功能。通过创建`Robot`实例...

    JAVA实现屏幕抓图 远程桌面控制

    ### JAVA实现屏幕抓图与远程桌面控制 #### 一、Java屏幕抓图技术解析 在Java中,要实现屏幕抓图的功能,主要依赖于`java.awt.Robot`类。该类提供了一系列方法来模拟键盘和鼠标操作,并允许开发人员捕获整个屏幕或...

    JAVA屏幕抓图(源码)

    在Java编程语言中,实现屏幕抓图功能是一项常见的任务,特别是在开发桌面应用或者需要进行自动化测试时。这个项目提供了一段源码,模仿了QQ截图的功能,允许用户通过拖动鼠标来选择屏幕上的任何区域进行截图,并且...

    java 屏幕抓图 源代码

    压缩包中的"ScreenCapture"可能是一个Java源文件,包含了实现屏幕抓图功能的主要代码。通常,它会包含一个主类,其中包含创建Robot对象、截取屏幕并保存或显示截图的逻辑。 8. **学习与实践**: 对于初学者来说,...

    屏幕抓图程序

    总结来说,构建一个屏幕抓图程序需要对Java GUI编程有深入理解,包括`java.awt`包下的各种类和接口。同时,还需要熟悉系统级交互和多线程编程,以实现更复杂的特性和功能。通过不断的实践和学习,开发者可以创建出...

    屏幕抓图小程序(完整及代码全)

    8. 源代码阅读与学习:对于这个压缩包中的"屏幕抓图"文件,使用者可以通过阅读源代码来深入理解屏幕抓图的实现过程,学习如何将理论知识应用到实际项目中。 总之,屏幕抓图小程序是一个综合性的项目,涵盖了图像...

    屏幕抓图,获取byte[]

    屏幕抓图,获取byte[]是计算机编程中一个常见的任务,主要应用于截图软件、远程桌面协作、游戏录制等领域。在这个过程中,我们需要将屏幕上的图像信息捕获并转化为字节数组(byte[]),以便于存储、传输或者进一步...

    抓图程序 JAVA版的教学PPT

    本资源聚焦于使用JAVA语言开发抓图程序,提供了一份详细的PPT教程,适合正在学习JAVA编程或者希望掌握屏幕截图功能的开发者。 【描述】:“这是对上一个资源JAVA抓图程序的PPT说明,格式是PPTX,如果学习的话可以...

    返回服务端当前屏幕抓图源码

    标题中的“返回服务端当前屏幕抓图源码”是指一种技术实现,允许远程用户通过网络访问服务端(通常是服务器)的实时屏幕截图。这项技术基于客户端-服务器模型,其中客户端(例如,用户的浏览器)发送请求到服务器,...

    红蜻蜓抓图

    通过深入研究"红蜻蜓抓图"的源代码,开发者不仅可以学习到如何利用Java实现屏幕截图应用,还能理解如何设计和优化面向对象的代码结构,以及如何打造用户友好的图形界面。对于想要提升Java编程技能或对桌面应用开发感...

    screen capture

    实现屏幕抓图的技术有多种,其中最基础的是操作系统内置的功能。例如,在Windows系统中,可以使用Print Screen (PrtScn) 键来全屏截图,或者使用Alt + PrtScn组合键来捕获当前活动窗口。截取的图像会被复制到剪贴板...

    根据选择区域截屏,获取屏幕图像数据

    综合以上信息,这个项目实现了一个基于MFC的屏幕截图工具,用户可以通过自定义选择区域,然后将截取的屏幕图像保存到文件中。整个过程涉及到Windows API调用、MFC组件的使用、图像数据处理和文件操作等多个知识点。

    根据url来获取页面的截图

    在这个场景中,我们可以使用Java编程语言,结合AWT(Abstract Window Toolkit)库来实现这一功能。下面将详细介绍这个过程及其相关知识点。 首先,我们需要理解`URL`(统一资源定位符)是互联网上的资源的唯一地址...

    商业编程-源码-抓图程序开发实践配套源代码.zip

    9. 编程语言和工具:根据源代码的文件扩展名,我们可以推测该程序可能是用C++、C#、Java或Python等语言编写的,因此还需要对应语言的基础知识。 通过研究这个项目的源代码,开发者不仅可以提升编程技巧,还能深入...

    完整版服务端抓图对应客户端实时监控程序.rar

    在技术实现上,服务端抓图可能使用了操作系统级别的截图API,或者利用屏幕捕获库来捕获桌面图像。这些图像可能经过压缩优化后通过HTTP、TCP/IP或者其他定制的网络协议发送到客户端。客户端则需要解码并显示这些图像...

    ATM的java实训项目设计报告书

    ATM的Java实训项目设计报告书是一份详细记录了如何使用Java编程语言实现自动取款机(ATM)系统的设计报告。这份报告由何珍珍和张明月两位同学完成,他们在河南经贸职业学院信息管理系学习《Java程序设计》课程,并在...

    屏幕捕捉软件

    屏幕捕捉软件可以用多种编程语言实现,如C++、C#、Python、Java等。每种语言都有其优势和适用场景,比如C++和C#在图形界面和性能上有优势,Python则易于开发和维护。 6. **跨平台考虑** 如果需要开发跨平台的屏幕...

    [神2也教你学E]服务端抓图对应客户端实时监控程序.rar

    通常,服务端可以使用多种编程语言实现,如Java、Python、Node.js或C#。服务端需要处理的主要任务包括接收客户端的监控请求,根据请求执行屏幕截图操作,并将截图数据传输回客户端。 2. **屏幕截图技术**:服务端...

    ScreenShotForMac:用于截屏的Java程序我想触摸机器人类...

    在Java编程语言的广阔世界里,有一款名为"ScreenShotForMac"的工具,专门针对Mac用户设计,旨在提供便捷的屏幕抓图功能。本文将深入探讨这款程序的实现原理和应用价值。 首先,让我们了解一下Java编程语言。Java是...

    ATM机Java语言程序的设计课程设计报告.doc

    在这个课程设计中,学生将使用Java语言来实现这一系统,以提升其编程技能和对面向对象设计的理解。 1. 概述 在设计ATM机系统时,首先需要进行问题分析。这涉及理解ATM机的主要功能,如存款、取款、查询余额、转账等...

Global site tag (gtag.js) - Google Analytics