import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class SnippingTool extends JFrame{
private BufferedImage image;
private BufferedImage bufferedImage;
private Rectangle screenSize, captureSize;
private GraphicsEnvironment env;
private Graphics2D g2d;
private GraphicsDevice[] devices;
private Dimension dimension;
private MouseMotionListener mousemotionlistener;
private MouseListener mouselistener;
private Point startDrag, endDrag;
private SelectOnFrame selectOnFrame;
private Color white = new Color(255, 255, 255, 100);
public SnippingTool() {
setUndecorated(true);
setAlwaysOnTop(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
env = GraphicsEnvironment.getLocalGraphicsEnvironment();
devices = env.getScreenDevices();
dimension = Toolkit.getDefaultToolkit().getScreenSize();
screenSize = new Rectangle(0, 0, dimension.width * devices.length, dimension.height);
setBounds(screenSize);
try {
bufferedImage = new Robot().createScreenCapture(screenSize);
image = new Robot().createScreenCapture(screenSize);
} catch (AWTException e) {
e.printStackTrace();
}
startDrag = new Point(0, 0);
endDrag = new Point(0, 0);
addListener();
selectOnFrame = new SelectOnFrame();
add(selectOnFrame, BorderLayout.CENTER);
setVisible(true);
}
public void paint(Graphics g) {
g2d = (Graphics2D) image.createGraphics();
g2d.setColor(white);
g2d.fill(screenSize);
g2d.drawImage(image, null, 0, 0);
g.drawImage(image, 0, 0, this);
}
public void addListener() {
mouselistener = new MouseListener() {
public void mouseReleased(MouseEvent ev) {
setVisible(false);
}
public void mousePressed(MouseEvent ev) {
startDrag = new Point(ev.getX(), ev.getY());
}
public void mouseEntered(MouseEvent ev) { }
public void mouseExited(MouseEvent ev) { }
public void mouseClicked(MouseEvent ev) { }
};
addMouseListener(mouselistener);
mousemotionlistener = new MouseMotionListener() {
public void mouseDragged(MouseEvent ev) {
endDrag = new Point(ev.getX(), ev.getY());
selectOnFrame.setPoints(startDrag, endDrag);
}
public void mouseMoved(MouseEvent ev) { }
};
addMouseMotionListener(mousemotionlistener);
}
public BufferedImage getScreenshot() {
if ((startDrag.y < endDrag.y) && (startDrag.x < endDrag.x)) {
captureSize = new Rectangle(startDrag.x, startDrag.y, endDrag.x - startDrag.x, endDrag.y - startDrag.y);
} else if ((startDrag.x > endDrag.x) && (startDrag.y < endDrag.y)) {
captureSize = new Rectangle(endDrag.x, startDrag.y, startDrag.x - endDrag.x, endDrag.y - startDrag.y);
} else if ((startDrag.y > endDrag.y) && (startDrag.x < endDrag.x)) {
captureSize = new Rectangle(startDrag.x, endDrag.y, endDrag.x - startDrag.x, startDrag.y - endDrag.y);
} else if ((startDrag.y > endDrag.y) && (startDrag.x > endDrag.x)) {
captureSize = new Rectangle(endDrag.x, endDrag.y, startDrag.x - endDrag.x, startDrag.y - endDrag.y);
}
return bufferedImage.getSubimage(captureSize.x, captureSize.y, captureSize.width, captureSize.height);
}
}