java截屏为BufferedImage对象,可以保存到剪贴板

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方法默认是关闭窗口,可以再处理保存到剪贴板等

猜你喜欢

转载自blog.csdn.net/superzlc/article/details/80418210
今日推荐