package com.image.capture;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.RoundRectangle2D;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;

import javax.swing.filechooser.FileFilter;

public class CaptureScreen extends JFrame implements ActionListener {
	private static final long serialVersionUID = 1L;
	private JButton start, save, saveFile, cancel;
	private JButton clipboard, clipboardScreen;
	private JCheckBox recapture = new JCheckBox("重新截取屏幕区域");
	private JPanel c;
	private BufferedImage get;
	private final JFrame th = this;

	public CaptureScreen() {
		super("多功能截屏软件");
		initWindow();
	}

	private void initWindow() {
		recapture.setEnabled(false);
		recapture.setSelected(true);
		start = new JButton("开始截取");
		cancel = new JButton("退出");
		save = new JButton("保存");
		saveFile = new JButton("全屏幕保存");
		clipboard = new JButton("区域截取到剪贴板");
		clipboardScreen = new JButton("全屏幕截取到剪贴板");
		start.addActionListener(this);
		save.addActionListener(this);
		save.setEnabled(false);
		saveFile.addActionListener(this);
		cancel.addActionListener(this);
		clipboard.addActionListener(this);
		clipboardScreen.addActionListener(this);
		JPanel buttonJP = new JPanel();
		JPanel buttonJP2 = new JPanel();
		c = new JPanel(new BorderLayout());
		JLabel jl = new JLabel("屏幕截取", JLabel.CENTER);
		jl.setFont(new Font("黑体", Font.BOLD, 40));
		jl.setForeground(Color.RED);
		c.add(jl, BorderLayout.CENTER);
		buttonJP.add(start);
		buttonJP.add(save);
		buttonJP.add(saveFile);
		buttonJP.add(cancel);
		buttonJP2.add(recapture);
		buttonJP2.add(clipboard);
		buttonJP2.add(clipboardScreen);
		add(c, BorderLayout.CENTER);
		add(buttonJP, BorderLayout.SOUTH);
		add(buttonJP2, BorderLayout.NORTH);
		setSize(450, 300);
		setLocationRelativeTo(null);
		setVisible(true);
		setAlwaysOnTop(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private void updates() {
		if (get != null) {
			ImageIcon ii = new ImageIcon(get);
			JLabel jl = new JLabel(ii);
			c.removeAll();
			c.add(new JScrollPane(jl), BorderLayout.CENTER);
			SwingUtilities.updateComponentTreeUI(this);
		}
	}

	private void doStart() {
		this.setVisible(false);
		try {
			Robot ro = new Robot();
			Dimension di = Toolkit.getDefaultToolkit().getScreenSize();
			final JFrame jf = new JFrame();
			final ScreenImagePanel sip = new ScreenImagePanel(this, jf,
					ro.createScreenCapture(new Rectangle(0, 0, di.width,
							di.height)), di.width, di.height);
			jf.add(sip);
			jf.addKeyListener(new KeyListener() {

				@Override
				public void keyPressed(KeyEvent e) {
					// TODO Auto-generated method stub

				}

				@Override
				public void keyReleased(KeyEvent e) {
					if (e.getKeyCode() == 27) {
						// over=false;
						jf.dispose();
						th.setVisible(true);
					}
				}

				@Override
				public void keyTyped(KeyEvent e) {
					// TODO Auto-generated method stub

				}

			});
			jf.setUndecorated(true);
			jf.setSize(di);
			jf.setVisible(true);
			jf.setAlwaysOnTop(true);
		} catch (Exception exe) {
			exe.printStackTrace();
		}
	}

	private void doSave() {
		try {
			JFileChooser jfc = new JFileChooser(".");
			jfc.addChoosableFileFilter(new JPGfilter());
			jfc.addChoosableFileFilter(new PNGfilter());
			jfc.addChoosableFileFilter(new BMPfilter());
			if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
				File file = jfc.getSelectedFile();
				String about = "PNG";
				String ext = file.toString().toLowerCase();
				FileFilter ff = jfc.getFileFilter();
				if (ff instanceof JPGfilter) {
					if (!ext.endsWith(".jpg")) {
						String ns = ext + ".jpg";
						file = new File(ns);
						about = "JPG";
					}
				} else if (ff instanceof PNGfilter) {
					if (!ext.endsWith(".png")) {
						String ns = ext + ".png";
						file = new File(ns);
						about = "PNG";
					}
				} else if (ff instanceof BMPfilter) {
					if (!ext.endsWith(".bmp")) {
						String ns = ext + ".bmp";
						file = new File(ns);
						about = "BMP";
					}
				}

				if (ImageIO.write(get, about, file)) {
					JOptionPane.showMessageDialog(this, "保存成功!");
					save.setEnabled(false);
				} else
					JOptionPane.showMessageDialog(this, "保存失败!");
			}
		} catch (Exception exe) {
			exe.printStackTrace();
		}
	}

	private void doSaveFile() {
		this.setVisible(false);
		try {
			JFileChooser jfc = new JFileChooser(".");
			jfc.addChoosableFileFilter(new JPGfilter());
			jfc.addChoosableFileFilter(new PNGfilter());
			jfc.addChoosableFileFilter(new BMPfilter());
			if (jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
				File file = jfc.getSelectedFile();
				String about = "PNG";
				String ext = file.toString().toLowerCase();
				FileFilter ff = jfc.getFileFilter();
				if (ff instanceof JPGfilter) {
					if (!ext.endsWith(".jpg")) {
						String ns = ext + ".jpg";
						file = new File(ns);
						about = "JPG";
					}
				} else if (ff instanceof PNGfilter) {
					if (!ext.endsWith(".png")) {
						String ns = ext + ".png";
						file = new File(ns);
						about = "PNG";
					}
				} else if (ff instanceof BMPfilter) {
					if (!ext.endsWith(".bmp")) {
						String ns = ext + ".bmp";
						file = new File(ns);
						about = "BMP";
					}
				}
				try {
					// 拷贝屏幕到一个BufferedImage对象screenshot
					Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
					BufferedImage screenshot = new Robot()
							.createScreenCapture(new Rectangle(0, 0, (int) d
									.getWidth(), (int) d.getHeight()));
					// 将screenshot对象写入图像文件
					if (ImageIO.write(screenshot, about, file)) {
						JOptionPane.showMessageDialog(this, "保存成功!");
					} else
						JOptionPane.showMessageDialog(this, "保存失败!");
				} catch (Exception ex) {
					System.err.println(ex);
				}
			}
		} catch (Exception exe) {
			exe.printStackTrace();
		} finally {
			this.setVisible(true);
		}
	}

	public void actionPerformed(ActionEvent ae) {
		if (ae.getSource() == start)
			doStart();
		else if (ae.getSource() == cancel)
			System.exit(0);
		else if (ae.getSource() == save)
			doSave();
		else if (ae.getSource() == saveFile)
			doSaveFile();
		else if (ae.getSource() == clipboard)
			doClipboard();
		else if (ae.getSource() == clipboardScreen)
			doClipboardScreen();
	}

	private void doClipboardScreen() {
		this.setVisible(false);
		try {
			Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
			new ClipboardUtil().writeToClipboard(new Robot()
					.createScreenCapture(new Rectangle(0, 0,
							(int) d.getWidth(), (int) d.getHeight())));
			JOptionPane.showMessageDialog(this, "全屏截图已复制到剪贴板!");
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			this.setVisible(true);
		}
	}

	private void doClipboard() {
		if (recapture.isSelected()) {
			this.setVisible(false);
			new Screenshot(this);
		} else {
			try {
				new ClipboardUtil().writeToClipboard(get);
				JOptionPane.showMessageDialog(this, "指定区域截图已复制到剪贴板!");
			} catch (Exception ex) {
				JOptionPane.showMessageDialog(this, "指定区域截图未复制到剪贴板!");
			} finally {
				this.setVisible(true);
			}
		}
	}

	// 一个文件后缀名选择器
	private class JPGfilter extends FileFilter {
		public boolean accept(File file) {
			return file.toString().toLowerCase().endsWith(".jpg")
					|| file.toString().toLowerCase().endsWith(".jpeg")
					|| file.isDirectory();
		}

		public String getDescription() {
			return "*.JPG,*.JPEG(JPG,JPEG图像)";
		}
	}

	private class PNGfilter extends FileFilter {
		public boolean accept(File file) {
			return file.toString().toLowerCase().endsWith(".png")
					|| file.isDirectory();
		}

		public String getDescription() {
			return "*.PNG(PNG图像)";
		}
	}

	private class BMPfilter extends FileFilter {
		public boolean accept(File file) {
			return file.toString().toLowerCase().endsWith(".bmp")
					|| file.isDirectory();
		}

		public String getDescription() {
			return "*.BMP(BMP位图)";
		}
	}

	// 一个暂时类,用于显示当前的屏幕图像
	private class ScreenImagePanel extends JPanel implements MouseListener,
			MouseMotionListener {
		private static final long serialVersionUID = 1L;
		private BufferedImage bi;
		private int width, height;
		private int startX, startY, endX, endY, tempX, tempY;
		private JFrame jf;
		private Rectangle select = new Rectangle(0, 0, 0, 0);// 表示选中的区域
		private States current = States.DEFAULT;// 表示当前的编辑状态
		private Rectangle[] rec;// 表示八个编辑点的区域
		private CaptureScreen cs;
		private ImageIcon icon = new ImageIcon();

		public ScreenImagePanel(CaptureScreen cs, JFrame jf, BufferedImage bi,
				int width, int height) throws AWTException {
			this.jf = jf;
			this.bi = bi;
			this.width = width;
			this.height = height;
			this.cs = cs;
			this.addMouseListener(this);
			this.addMouseMotionListener(this);
			initRecs();
		}

		private void initRecs() {
			rec = new Rectangle[8];
			for (int i = 0; i < rec.length; i++)
				rec[i] = new Rectangle();
		}

		public void paintComponent(Graphics g) {
			g.drawImage(bi, 0, 0, width, height, this);
			g.setColor(Color.RED);
			g.drawLine(startX, startY, endX, startY);
			g.drawLine(startX, endY, endX, endY);
			g.drawLine(startX, startY, startX, endY);
			g.drawLine(endX, startY, endX, endY);
			int x = startX < endX ? startX : endX;
			int y = startY < endY ? startY : endY;
			select = new Rectangle(x, y, Math.abs(endX - startX), Math.abs(endY
					- startY));
			int x1 = (startX + endX) / 2;
			int y1 = (startY + endY) / 2;
			g.fillRect(x1 - 2, startY - 2, 5, 5);
			g.fillRect(x1 - 2, endY - 2, 5, 5);
			g.fillRect(startX - 2, y1 - 2, 5, 5);
			g.fillRect(endX - 2, y1 - 2, 5, 5);
			g.fillRect(startX - 2, startY - 2, 5, 5);
			g.fillRect(startX - 2, endY - 2, 5, 5);
			g.fillRect(endX - 2, startY - 2, 5, 5);
			g.fillRect(endX - 2, endY - 2, 5, 5);
			rec[0] = new Rectangle(x - 5, y - 5, 10, 10);
			rec[1] = new Rectangle(x1 - 5, y - 5, 10, 10);
			rec[2] = new Rectangle((startX > endX ? startX : endX) - 5, y - 5,
					10, 10);
			rec[3] = new Rectangle((startX > endX ? startX : endX) - 5, y1 - 5,
					10, 10);
			rec[4] = new Rectangle((startX > endX ? startX : endX) - 5,
					(startY > endY ? startY : endY) - 5, 10, 10);
			rec[5] = new Rectangle(x1 - 5, (startY > endY ? startY : endY) - 5,
					10, 10);
			rec[6] = new Rectangle(x - 5, (startY > endY ? startY : endY) - 5,
					10, 10);
			rec[7] = new Rectangle(x - 5, y1 - 5, 10, 10);
			Graphics2D g2d = (Graphics2D) g;
			g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
			g2d.setColor(new Color(150, 150, 150));
			AlphaComposite composite = AlphaComposite.getInstance(
					AlphaComposite.SRC_OVER, 60 / 100.0F);
			g2d.setComposite(composite);
			g2d.fill(new RoundRectangle2D.Float(0, 0, this.getWidth(), this
					.getHeight(), 0, 0));
			if (endY != startY && endX != startX) {
				icon.setImage(bi.getSubimage(x, y, Math.abs(endX - startX),
						Math.abs(endY - startY)));
				g.drawImage(icon.getImage(), x, y, this);
			}
		}

		public void mouseMoved(MouseEvent me) {
			if (select.contains(me.getPoint())) {
				this.setCursor(new Cursor(Cursor.MOVE_CURSOR));
				current = States.MOVE;
			} else {
				States[] st = States.values();
				for (int i = 0; i < rec.length; i++) {
					if (rec[i].contains(me.getPoint())) {
						current = st[i];
						this.setCursor(st[i].getCursor());
						return;
					}
				}
				current = States.DEFAULT;
			}
		}

		public void mouseExited(MouseEvent me) {

		}

		public void mouseEntered(MouseEvent me) {

		}

		public void mouseDragged(MouseEvent me) {
			int x = me.getX();
			int y = me.getY();
			if (current == States.MOVE) {
				startX += (x - tempX);
				startY += (y - tempY);
				endX += (x - tempX);
				endY += (y - tempY);
				tempX = x;
				tempY = y;
			} else if (current == States.EAST) {
				if (startX > endX) {
					startX += (x - tempX);
					tempX = x;
				} else {
					endX += (x - tempX);
					tempX = x;
				}
			} else if (current == States.NORTH) {
				if (startY < endY) {
					startY += (y - tempY);
					tempY = y;
				} else {
					endY += (y - tempY);
					tempY = y;
				}
			} else if (current == States.WEST) {
				if (startX < endX) {
					startX += (x - tempX);
					tempX = x;
				} else {
					endX += (x - tempX);
					tempX = x;
				}
			} else if (current == States.SOUTH) {
				if (startY > endY) {
					startY += (y - tempY);
					tempY = y;
				} else {
					endY += (y - tempY);
					tempY = y;
				}
			} else if (current == States.NORTH_EAST) {
				if (startX > endX) {
					startX += (x - tempX);
					tempX = x;
				} else {
					endX += (x - tempX);
					tempX = x;
				}
				if (startY < endY) {
					startY += (y - tempY);
					tempY = y;
				} else {
					endY += (y - tempY);
					tempY = y;
				}
			} else if (current == States.NORTH_WEST) {
				if (startX < endX) {
					startX += (x - tempX);
					tempX = x;
				} else {
					endX += (x - tempX);
					tempX = x;
				}
				if (startY < endY) {
					startY += (y - tempY);
					tempY = y;
				} else {
					endY += (y - tempY);
					tempY = y;
				}
			} else if (current == States.SOUTH_EAST) {
				if (startY > endY) {
					startY += (y - tempY);
					tempY = y;
				} else {
					endY += (y - tempY);
					tempY = y;
				}
				if (startX > endX) {
					startX += (x - tempX);
					tempX = x;
				} else {
					endX += (x - tempX);
					tempX = x;
				}
			} else if (current == States.SOUTH_WEST) {
				if (startY > endY) {
					startY += (y - tempY);
					tempY = y;
				} else {
					endY += (y - tempY);
					tempY = y;
				}
				if (startX < endX) {
					startX += (x - tempX);
					tempX = x;
				} else {
					endX += (x - tempX);
					tempX = x;
				}
			}

			else {
				startX = tempX;
				startY = tempY;
				endX = me.getX();
				endY = me.getY();
			}
			this.repaint();
		}

		public void mousePressed(MouseEvent me) {
			tempX = me.getX();
			tempY = me.getY();
			if (me.getButton() == 3) {
				jf.dispose();
				cs.setVisible(true);
			}
		}

		public void mouseReleased(MouseEvent me) {
			if (me.isPopupTrigger()) {
				if (current == States.MOVE) {
					startX = 0;
					startY = 0;
					endX = 0;
					endY = 0;
					repaint();
				} else {
					jf.dispose();
					updates();
				}
			}
		}

		public void mouseClicked(MouseEvent me) {
			if (me.getButton() == 1 && me.getClickCount() == 2) {
				Point p = me.getPoint();
				if (select.contains(p)) {
					if (select.x + select.width < this.getWidth()
							&& select.y + select.height < this.getHeight()) {
						get = bi.getSubimage(select.x, select.y, select.width,
								select.height);
					} else {
						int wid = select.width, het = select.height;
						if (select.x + select.width >= this.getWidth()) {
							wid = this.getWidth() - select.x;
						}
						if (select.y + select.height >= this.getHeight()) {
							het = this.getHeight() - select.y;
						}
						get = bi.getSubimage(select.x, select.y, wid, het);
					}
					updates();
					if (get.getWidth() + 20 > 450) {
						cs.setLocation(
								(bi.getWidth() - get.getWidth() - 20) / 2,
								(bi.getHeight() - get.getHeight() - 80) / 2);
						cs.setSize(get.getWidth() + 20, get.getHeight() + 120);
					} else {
						cs.setLocation((bi.getWidth() - 450) / 2,
								(bi.getHeight() - get.getHeight() - 80) / 2);
						cs.setSize(450, get.getHeight() + 120);
					}
					cs.setVisible(true);
					jf.dispose();
					save.setEnabled(true);
					recapture.setEnabled(true);
				}
			} else if (me.getButton() == 3) {
				jf.dispose();
				cs.setVisible(true);
			}
		}
	}

	public static void main(String args[]) {
		new CaptureScreen();
	}
}

enum States {
	NORTH_WEST(new Cursor(Cursor.NW_RESIZE_CURSOR)), NORTH(new Cursor(
			Cursor.N_RESIZE_CURSOR)), NORTH_EAST(new Cursor(
			Cursor.NE_RESIZE_CURSOR)), EAST(new Cursor(Cursor.E_RESIZE_CURSOR)), SOUTH_EAST(
			new Cursor(Cursor.SE_RESIZE_CURSOR)), SOUTH(new Cursor(
			Cursor.S_RESIZE_CURSOR)), SOUTH_WEST(new Cursor(
			Cursor.SW_RESIZE_CURSOR)), WEST(new Cursor(Cursor.W_RESIZE_CURSOR)), MOVE(
			new Cursor(Cursor.MOVE_CURSOR)), DEFAULT(new Cursor(
			Cursor.DEFAULT_CURSOR));
	private Cursor cs;

	States(Cursor cs) {
		this.cs = cs;
	}

	public Cursor getCursor() {
		return cs;
	}
}
最近下载更多
fgg047  LV1 2022年1月24日
laowang933  LV1 2021年5月3日
2196316269  LV10 2020年11月21日
675104182  LV14 2020年9月22日
天空java  LV7 2020年6月1日
wngauss  LV4 2020年5月22日
SKxumeng  LV1 2019年5月28日
鱼椒盐排骨  LV8 2019年5月27日
blb555  LV14 2019年5月26日
cdstone  LV1 2019年4月30日
最近浏览更多
ja12121  LV2 2023年6月17日
微信网友_5992582549164032  LV6 2023年2月21日
maoye520  LV1 2022年8月10日
fantaohaofan  LV2 2022年6月23日
977903096  LV10 2022年3月12日
fgg047  LV1 2022年1月24日
laowang933  LV1 2021年5月3日
风雨不怕  LV4 2021年2月26日
会飞的小马 2021年1月9日
暂无贡献等级
231565156165  LV3 2020年12月17日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友