您的位置:首页 > 编程语言 > Java开发

用JAVA实现屏幕抓图的简单实例

2007-05-28 00:54 686 查看
/* 主要使用的是java.util.Robot类来捕获屏幕,

* 可以实现对屏幕一个矩形区域的捕获,通过这个类,

* 我们也可以实现一个远程桌面控制的程序

*/

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.*;

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: