Screen capture with crop operation : Screen Capture « 2D Graphics « Java Tutorial






Screen capture with crop operation
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ScreenCapture extends JFrame {
  ImageArea ia = new ImageArea();

  Rectangle rectScreenSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

  static Robot robot;

  JScrollPane jsp;

  public ScreenCapture(String title) {
    super(title);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    JMenuBar mb = new JMenuBar();
    JMenu menu = new JMenu("File");
    ActionListener al;

    JMenuItem mi = new JMenuItem("Save");
    al = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        save();
      }
    };

    mi.addActionListener(al);
    menu.add(mi);
    mb.add(menu);

    menu = new JMenu("Capture");

    mi = new JMenuItem("Capture");
    al = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        setVisible(false);

        BufferedImage biScreen = robot.createScreenCapture(rectScreenSize);
        setVisible(true);

        ia.setImage(biScreen);

        jsp.getHorizontalScrollBar().setValue(0);
        jsp.getVerticalScrollBar().setValue(0);
      }
    };

    mi.addActionListener(al);
    menu.add(mi);

    mb.add(menu);

    mi = new JMenuItem("Crop");
    al = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        if (ia.crop()) {
          jsp.getHorizontalScrollBar().setValue(0);
          jsp.getVerticalScrollBar().setValue(0);
        }
      }
    };

    mi.addActionListener(al);
    menu.add(mi);

    mb.add(menu);
    setJMenuBar(mb);
    getContentPane().add(jsp = new JScrollPane(ia));
    setVisible(true);
  }

  private void save() {
    if (ia.getImage() == null) {
      System.out.println("No captured image.");
      return;
    }
    ImageWriter writer = null;
    ImageOutputStream ios = null;

    try {
      Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");

      if (!iter.hasNext()) {
        System.out.println("Unable to save image to jpeg file type.");
        return;
      }
      writer = (ImageWriter) iter.next();
      ios = ImageIO.createImageOutputStream(new File("c:\\a.jpg"));
      writer.setOutput(ios);
      ImageWriteParam iwp = writer.getDefaultWriteParam();
      iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
      iwp.setCompressionQuality(0.95f);
      writer.write(null,
          new IIOImage((BufferedImage) ia.getImage(), null, null), iwp);
    } catch (Exception e2) {
      e2.printStackTrace();
    }

  }

  public static void main(String[] args) throws Exception {
    robot = new Robot();
    new ScreenCapture("Capture");
  }
}

class ImageArea extends JPanel {
  private Image image;

  Point startPoint = new Point(), endPoint = new Point();

  private Rectangle selectedRectangle = new Rectangle();

  public ImageArea() {
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        if (image == null)
          return;
        startPoint = endPoint = e.getPoint();
        repaint();
      }
    });

    addMouseMotionListener(new MouseMotionAdapter() {
      public void mouseDragged(MouseEvent e) {
        if (image == null)
          return;

        endPoint = e.getPoint();
        repaint();
      }
    });
  }

  public boolean crop() {
    if (startPoint.equals(endPoint))
      return true;

    boolean succeeded = true;

    int x1 = (startPoint.x < endPoint.x) ? startPoint.x : endPoint.x;
    int y1 = (startPoint.y < endPoint.y) ? startPoint.y : endPoint.y;

    int x2 = (startPoint.x > endPoint.x) ? startPoint.x : endPoint.x;
    int y2 = (startPoint.y > endPoint.y) ? startPoint.y : endPoint.y;

    int width = (x2 - x1) + 1;
    int height = (y2 - y1) + 1;

    BufferedImage biCrop = new BufferedImage(width, height,
        BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = biCrop.createGraphics();
    BufferedImage bi = (BufferedImage) image;
    BufferedImage bi2 = bi.getSubimage(x1, y1, width, height);
    g2d.drawImage(bi2, null, 0, 0);

    g2d.dispose();

    if (succeeded)
      setImage(biCrop);
    else {
      startPoint.x = endPoint.x;
      startPoint.y = endPoint.y;
      repaint();
    }

    return succeeded;
  }

  public Image getImage() {
    return image;
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (image != null)
      g.drawImage(image, 0, 0, this);

    if (startPoint.x != endPoint.x || startPoint.y != endPoint.y) {
      int x1 = (startPoint.x < endPoint.x) ? startPoint.x : endPoint.x;
      int y1 = (startPoint.y < endPoint.y) ? startPoint.y : endPoint.y;
      int x2 = (startPoint.x > endPoint.x) ? startPoint.x : endPoint.x;
      int y2 = (startPoint.y > endPoint.y) ? startPoint.y : endPoint.y;
      selectedRectangle.x = x1;
      selectedRectangle.y = y1;
      selectedRectangle.width = (x2 - x1) + 1;
      selectedRectangle.height = (y2 - y1) + 1;
      Graphics2D g2d = (Graphics2D) g;
      g2d.draw(selectedRectangle);
    }
  }

  public void setImage(Image image) {
    this.image = image;
    setPreferredSize(new Dimension(image.getWidth(this), image.getHeight(this)));
    revalidate();
    startPoint.x = endPoint.x;
    startPoint.y = endPoint.y;
    repaint();
  }
}








16.44.Screen Capture
16.44.1.Capture Screen
16.44.2.Screen capture with crop operationScreen capture with crop operation