Java Swing模拟屏幕截图
原理:
点击截图时,获取当前屏幕的图像,然后再这个静态的图像上进行选择操作。
代码:
ScreenShot.java
////////////////////////////////////////////////////////////////////////////////////////////////
package com.qiu.util;
import java.awt.AWTException;
import
java.awt.Color;
import java.awt.Cursor;
import
java.awt.Graphics;
import java.awt.Graphics2D;
import
java.awt.Image;
import java.awt.Rectangle;
import
java.awt.Robot;
import java.awt.Toolkit;
import
java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import
java.awt.event.MouseMotionListener;
import
java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;
import
java.util.Date;
import javax.swing.ImageIcon;
import
javax.swing.JFrame;
import javax.swing.JLabel;
public class ScreenShot extends JFrame {
private static
final long serialVersionUID = 1L;
private Image image;
private JLabel
imageLabel;
private int width =
Toolkit.getDefaultToolkit().getScreenSize().width;
private int height =
Toolkit.getDefaultToolkit().getScreenSize().height;
private int
isExit;
private String filename;
private int x, y, xEnd, yEnd; // 用于记录鼠标点击开始和结束的坐标
/**
*
*
* @param isExit
* 选择是否退出
* 0-- 退出系统
* !0 -- 只是隐藏
* @param filename
* 截图生成文件名
*
@throws AWTException
* @throws InterruptedException
*/
public
ScreenShot(int isExit,String filename) throws AWTException, InterruptedException
{
this.isExit=isExit;
this.filename=filename;
image =
GraphicsUtils.getScreenImage(0, 0, width,
height);
imageLabel =
new JLabel(new ImageIcon(image));
imageLabel.setCursor(new
Cursor(Cursor.CROSSHAIR_CURSOR));
createAction();
getContentPane().add(imageLabel);
setUndecorated(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setExtendedState(JFrame.MAXIMIZED_BOTH); }
/**
* 实现监听动作
*/
private void createAction()
{
imageLabel.addMouseListener(new MouseAdapter() {
public void
mouseClicked(MouseEvent e) {
if (e.isMetaDown()) {
if(isExit==0){
System.exit(0);
}else{
ScreenShot.this.dispose();
}
}
}
public void mousePressed(MouseEvent e) {
x =
e.getX();
y = e.getY();
}
public void mouseReleased(MouseEvent e) {
xEnd =
e.getX();
yEnd = e.getY();
try {
image =
GraphicsUtils.getScreenImage(Math.min(x, xEnd),
Math.min(y, yEnd),
Math.abs(xEnd - x),
Math.abs(yEnd - y));
} catch (AWTException
e1) {
e1.printStackTrace();
} catch (InterruptedException e1)
{
e1.printStackTrace();
}
// 为了查看截图效果,将区域截图的部分代替全屏的截图展示
imageLabel.setIcon(new ImageIcon(image));
/**
休眠1S,为了查看截图区域在全屏的位置
try
{
Thread.sleep(1000);
} catch (InterruptedException e1)
{
e1.printStackTrace();
}
*/
if (image != null) {
new ShowWindow(new
ImageIcon(image),isExit,filename);
ScreenShot.this.dispose();
}
}
});
imageLabel.addMouseMotionListener(new
MouseMotionListener() {
public void mouseDragged(MouseEvent e)
{
xEnd = e.getX();
yEnd =
e.getY();
BufferedImage bi = new
BufferedImage(image.getWidth(null),
image.getHeight(null),
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D)
bi.getGraphics();
g2d.drawImage(image, 0, 0,
null);
g2d.setColor(Color.RED);
g2d.drawRect(Math.min(x, xEnd) -
1, Math.min(y, yEnd) - 1,
Math.abs(xEnd - x) + 1, Math.abs(yEnd - y) +
1);
g2d.dispose();
Graphics g =
imageLabel.getGraphics();
g.drawImage(bi, 0, 0,
null);
g.dispose();
}
public void mouseMoved(MouseEvent e) {
x =
e.getX();
y = e.getY();
BufferedImage bi = new
BufferedImage(image.getWidth(null),
image.getHeight(null),
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D)
bi.getGraphics();
g2d.drawImage(image, 0, 0,
null);
g2d.setColor(Color.RED);
g2d.drawLine(x, 0, x,
height);
g2d.drawLine(0, y,width,
y);
g2d.dispose();
Graphics g =
imageLabel.getGraphics();
g.drawImage(bi, 0, 0,
null);
g.dispose();
}
});
}
public static void main(String[] args) throws
AWTException,
InterruptedException {
String filename = new
SimpleDateFormat("MM-dd-HH-mm-ss").format(new Date())+".png";
new
ScreenShot(0,filename);
}
}
class GraphicsUtils {
/**
* 截图屏幕中制定区域的图片
*
* @param x
* @param y
* @param w
* @param h
* @return
被截部分的BufferedImage对象
* @throws AWTException
* @throws
InterruptedException
*/
public static BufferedImage getScreenImage(int
x, int y, int w, int h)
throws AWTException, InterruptedException
{
Robot robot = new Robot();
BufferedImage screen =
null;
if(w-x>0){
screen = robot.createScreenCapture(new
Rectangle(x, y, w,h));
}
return screen;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
ShowWindow .java
////////////////////////////////////////////////////////////////////////////////////////////////
package com.qiu.util;
import java.awt.BorderLayout;
import
java.awt.Color;
import java.awt.GridLayout;
import
java.awt.Image;
import java.awt.Point;
import
java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import
java.awt.event.MouseListener;
import
java.awt.event.MouseMotionAdapter;
import
java.awt.image.BufferedImage;
import java.io.File;
import
java.io.IOException;
import javax.imageio.ImageIO;
import
javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import
javax.swing.JButton;
import javax.swing.JFileChooser;
import
javax.swing.JFrame;
import javax.swing.JLabel;
import
javax.swing.JOptionPane;
import javax.swing.JPanel;
import
javax.swing.filechooser.FileNameExtensionFilter;
public class ShowWindow extends JFrame implements
MouseListener{
private static final long serialVersionUID = 1L;
static Point origin = new Point();
private ImageIcon ii;
private JButton save;
private
JButton cancel;
private int isExit;
private String
filename;
private JFileChooser chooser;
public ShowWindow(ImageIcon ii,int isExit,String filename)
{
this.filename=filename;
this.isExit=isExit;
this.ii =
ii;
initUI();
initLayout();
setSize(ii.getIconWidth(),
ii.getIconHeight() +
30);
setUndecorated(true);
setLocationRelativeTo(null);
WindowMove();
setVisible(true);
}
private void initUI() {
save = new
JButton("保存");
cancel = new
JButton("取消");
save.addMouseListener(this);
cancel.addMouseListener(this);
chooser
= new JFileChooser();
FileNameExtensionFilter filter = new
FileNameExtensionFilter("JPG & PNG Images", "jpg",
"png");
chooser.setFileFilter(filter);
}
private void initLayout() {
JPanel main = new
JPanel(new
BorderLayout());
main.setBorder(BorderFactory.createLineBorder(Color.BLUE));
JPanel
btnpane = new JPanel(new GridLayout(1,
8));
btnpane.add(save);
btnpane.add(cancel);
main.add(new JLabel(ii),
BorderLayout.CENTER);
main.add(btnpane,
BorderLayout.SOUTH);
add(main);
}
// 窗体移动函数
public void WindowMove() {
//
设置没有标题的窗口可以拖动
this.addMouseListener(new MouseAdapter() {
public void
mousePressed(MouseEvent e) {
origin.x = e.getX(); //
当鼠标按下的时候获得窗口当前的位置
origin.y =
e.getY();
}
});
this.addMouseMotionListener(new
MouseMotionAdapter() {
public void mouseDragged(MouseEvent e)
{
Point p = getLocation();
setLocation(p.x + e.getX() - origin.x,
p.y + e.getY()
- origin.y);
}
});
}
@Override
public void mouseClicked(MouseEvent e)
{
if(e.getSource()==cancel){
if(isExit==0){
System.exit(0);
}else{
ShowWindow.this.dispose();
}
}
if(e.getSource()==save){
File
file = null;
chooser.setSelectedFile(new File(filename));
int
returnVal = chooser.showSaveDialog(ShowWindow.this);
if(returnVal ==
JFileChooser.APPROVE_OPTION) {
file =
chooser.getSelectedFile();
}
Image img = ii.getImage();
try {
if(file != null)
{
ImageIO.write((BufferedImage)img, "png",
file);
JOptionPane.showMessageDialog(ShowWindow.this, "保存成功", "温馨提示",
JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
}
@Override
public void mousePressed(MouseEvent e)
{
}
@Override
public void mouseReleased(MouseEvent e)
{
}
@Override
public void mouseEntered(MouseEvent e)
{
}
@Override
public void mouseExited(MouseEvent e)
{
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
使用方法
////////////////////////////////////////////////////////////////////////////////////////////////
package screenshot;
import java.awt.AWTException;
import
java.text.SimpleDateFormat;
import java.util.Date;
import com.qiu.util.ScreenShot;
public class Test {
public static void main(String[]
args) {
String filename = new
SimpleDateFormat("MM-dd-HH-mm-ss")
.format(new Date()) + ".png";
try
{
new ScreenShot(0, filename);
} catch (AWTException e)
{
e.printStackTrace();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}