package com.superzlc.zlctest.proj.image;
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.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.IOException;
import javax.swing.JDialog;
public class ScreenShotDialog extends JDialog {
public static void main(String[] args) throws Exception {
ScreenShotDialog t = new ScreenShotDialog(null) {
private static final long serialVersionUID = 1L;
protected void capture() {
super.capture();
// 处理截取的图片imageOut,这里复制到剪贴板
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new Transferable(){
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{DataFlavor.imageFlavor};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.imageFlavor.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if (!DataFlavor.imageFlavor.equals(flavor)) {
throw new UnsupportedFlavorException(flavor);
}
return imageOut;
}
}, null);
}
};
t.open();
}
private static final long serialVersionUID = 1L;
private int orgx, orgy, endx, endy;
private Dimension screenSize;
private BufferedImage imageSrc;
private BufferedImage imageTmp;
public BufferedImage imageOut;
private Graphics g;
@Override
public void paint(Graphics g) {
if (imageTmp != null) {
g.drawImage(imageTmp, 0, 0, this);
}
}
private void drawSelectArea() {
if (g == null) {
g = this.getGraphics();
}
if (imageTmp == null)
return;
g.drawImage(imageTmp, 0, 0, this);
if (orgx == -1 || orgy == -1)
return;
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;
g.setColor(Color.BLUE);
g.drawRect(x - 1, y - 1, width + 1, height + 1);
imageOut = imageSrc.getSubimage(x, y, width, height);
g.drawImage(imageOut, x, y, this);
// 截图信息
int tx = endx + 5;
int ty = endy + 20;
if (tx + 100 > screenSize.width || ty + 30 > screenSize.height) {
tx = endx - 100;
ty = endy - 30;
}
g.setColor(Color.RED);
g.drawString("w: " + width + ", h: " + height, tx, ty);
}
private void bindSelectAreaListener() {
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
orgx = e.getX();
orgy = e.getY();
} else if (e.getButton() == MouseEvent.BUTTON3) {
orgx = -1;
orgy = -1;
capture();
}
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
endx = e.getX();
endy = e.getY();
drawSelectArea();
}
});
}
public ScreenShotDialog(JDialog owner) throws Exception {
super(owner);
}
public void open() throws Exception {
if (this.getOwner() != null)
this.getOwner().setVisible(false);
bindSelectAreaListener();
// 截图
Thread.sleep(100); // 等待隐藏再截图
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
imageSrc = this.screenCapture(screenSize);
imageTmp = new RescaleOp(0.8f, 0, null).filter(imageSrc, null);
this.setUndecorated(true);
this.setResizable(false);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice();
gd.setFullScreenWindow(this);
}
protected void close() {
this.dispose();
if (this.getOwner() != null)
this.getOwner().setVisible(true);
}
protected void capture() {
close();
// 可以在处理imageC
}
public BufferedImage screenCapture(Dimension screenSize) throws AWTException {
Robot robot = new Robot();
return robot.createScreenCapture(new Rectangle(0, 0, screenSize.width, screenSize.height));
}
}
查资料参考综合整理后的,capture方法默认是关闭窗口,可以再处理保存到剪贴板等