[java]代码库
package com.mingrisoft.frame;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.JWindow;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;
import com.mingrisoft.EQ;
/**
* 截图工具类 此类本身是一个JWindow窗体,窗体会覆盖整个屏幕,覆盖之前会捕获当期桌面的影响图片,但所有的操作其实是在此窗体上的。
*
*/
public class CaptureScreenUtil extends JWindow {
private int startX, startY;// 鼠标定位的开始坐标
private int endX, endy;// 鼠标定位的结束坐标
private BufferedImage screenImage = null;// 桌面全屏图片
private BufferedImage tempImage = null;// 修改后成暗灰色的全屏图片
private BufferedImage saveImage = null;// 截图
private ToolsWindow toolWindow = null;// 工具栏窗体
private Toolkit tool = null;// 组件工具包
public CaptureScreenUtil() {
tool = Toolkit.getDefaultToolkit();// 创建系统该默认组件工具包
Dimension d = tool.getScreenSize();// 获取屏幕尺寸,赋给一个二维坐标对象
setBounds(0, 0, d.width, d.height);// 设置截图窗口坐标和大小
Robot robot;// 创建Java自动化测试类
try {
robot = new Robot();
Rectangle fanwei = new Rectangle(0, 0, d.width, d.height);// 创建区域范围类
screenImage = robot.createScreenCapture(fanwei);// 捕捉此区域所有像素所生成的图像
addAction();// 添加动作监听
setVisible(true);// 窗体可见
} catch (AWTException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "截图功能无法使用", "错误",
JOptionPane.ERROR_MESSAGE);
}
}
/**
* 添加动作监听
*/
private void addAction() {
// 截图窗体添加鼠标事件监听
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {// 鼠标按下时
startX = e.getX();// 记录此时鼠标横坐标
startY = e.getY();// 记录此时鼠标纵坐标
if (toolWindow != null) {// 如果工具栏窗体对象已存在
toolWindow.setVisible(false);// 让工具栏窗体隐藏
}
}
@Override
public void mouseReleased(MouseEvent e) {// 鼠标松开时
if (toolWindow == null) {// 如果工具栏窗体对象是null
toolWindow = new ToolsWindow(e.getX(), e.getY());// 创建新的工具栏窗体
} else {
toolWindow.setLocation(e.getX(), e.getY());// 指定工具栏窗体在屏幕上的位置
}
toolWindow.setVisible(true);// 工具栏窗显示
toolWindow.toFront();// 工具栏窗体置顶
}
});
// 截图窗体添加鼠标拖拽事件监听
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {// 当鼠标被按下并拖拽时
// 记录鼠标拖动轨迹
endX = e.getX();// 横坐标
endy = e.getY();// 纵坐标
// 临时图像,用于缓冲屏幕区域放置屏幕闪烁
Image backgroundImage = createImage(getWidth(), getHeight());// 创建背景图像
Graphics g = backgroundImage.getGraphics();// 获得背景图像的绘图对象
g.drawImage(tempImage, 0, 0, null);// 在背景中绘制暗灰色的屏幕图片
int x = Math.min(startX, endX);// 在鼠标起始位置和结束位置区一个最小的
int y = Math.min(startY, endy);// 在鼠标起始位置和结束位置区一个最小的
int width = Math.abs(endX - startX) + 1;// 图片最小宽度为1像素
int height = Math.abs(endy - startY) + 1;// 图片最小高度为1像素
g.setColor(Color.BLUE);// 使用蓝色画笔画边框
g.drawRect(x - 1, y - 1, width + 1, height + 1);// 画一个矩形,流出一个像素的距离让边框可以显示
saveImage = screenImage.getSubimage(x, y, width, height);// 截图全屏图片
g.drawImage(saveImage, x, y, null);// 在背景中绘制截取出的图片
getGraphics().drawImage(backgroundImage, 0, 0,
CaptureScreenUtil.this);// 背景图像
}
});
}
/**
* 绘制组件
*/
public void paint(Graphics g) {
RescaleOp ro = new RescaleOp(0.5f, 0, null);// 创建RescaleOp对象,来更改图片每个颜色的颜色偏差,颜色偏移量为0.5f(暗色)
tempImage = ro.filter(screenImage, null);// 将屏幕图片的每个像素进行颜色调整,付给临时的图片对象
g.drawImage(tempImage, 0, 0, this);// 重新绘制暗灰色的屏幕图片
}
/**
* 将当前截图保存到本地
*/
public void saveImage() {
JFileChooser jfc = new JFileChooser();// 创建文件过滤器
jfc.setDialogTitle("保存图片");// 设置文件选择器标题
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG",
"jpg");// 创建文件过滤器,只显示.jpg后缀的图片
jfc.setFileFilter(filter);// 文件选择器使用过滤器
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");// 创建日期格式化类
String fileName = sdf.format(new Date());// 将当前日期作为文件名
FileSystemView view = FileSystemView.getFileSystemView();// 获取系统文件视图类
File filePath = view.getHomeDirectory();// 获取桌面路径
File saveFile = new File(filePath, fileName + ".jpg");// 创建要被保存的图片文件
jfc.setSelectedFile(saveFile);// 将文件选择器的默认选中文件设为saveFile
int flag = jfc.showSaveDialog(this);// 在主窗体中弹出文件选择器,获取用户操作码
if (flag == JFileChooser.APPROVE_OPTION) {// 如果选中的是保存按钮
try {
ImageIO.write(saveImage, "jpg", saveFile);// 生成jpg格式的图片文件
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this, "文件无法保存!", "错误",
JOptionPane.ERROR);
} finally {
disposeAll();// 销毁所有截图窗体
}
}
}
/**
* 把截图放入剪切板
*/
private void imagetoClipboard() {
// 创建传输接口的对象,使用接口本身创建内部类
Transferable trans = 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 (isDataFlavorSupported(flavor)) {// 如果传入的特征符合图片特征
return saveImage;// 返回截图
}
return null;
}
};
Clipboard clipboard = tool.getSystemClipboard();// 获得系统剪切板对象
clipboard.setContents(trans, null);// 将当前截图放入剪切板
}
/**
* 工具栏窗体
*/
private class ToolsWindow extends JWindow {
/**
* 工具栏窗体构造方法
*
* @param x
* - 工具栏显示的横坐标
* @param y
* - 工具栏显示的横坐标
*/
public ToolsWindow(int x, int y) {
setLocation(x, y);// 设定窗体在屏幕中显示的位置
JPanel mainPanel = new JPanel();// 主容器面板
mainPanel.setLayout(new BorderLayout());// 容器使用边界布局
JToolBar toolBar = new JToolBar();// 工具栏
toolBar.setFloatable(false); // 工具栏不可拖动
JButton saveButton = new JButton();// 保存按钮
Icon saveIcon = new ImageIcon(
EQ.class.getResource("/image/telFrameImage/CaptureScreen/save.png"));
saveButton.setIcon(saveIcon);
saveButton.addActionListener(new ActionListener() {// 按钮点击事件
@Override
public void actionPerformed(ActionEvent e) {
saveImage();// 保存当前截图
}
});
toolBar.add(saveButton);// 工具栏添加按鈕
JButton closeButton = new JButton();// 关闭按钮
Icon closeIcon = new ImageIcon(
EQ.class.getResource("/image/telFrameImage/CaptureScreen/close.png"));
closeButton.setIcon(closeIcon);
closeButton.addActionListener(new ActionListener() {// 按钮点击事件
@Override
public void actionPerformed(ActionEvent e) {
disposeAll();// 销毁全部窗体
}
});
toolBar.add(closeButton);
JButton copyButton = new JButton();// 将图片放入剪切板按钮
Icon copyIcon = new ImageIcon(
EQ.class.getResource("/image/telFrameImage/CaptureScreen/copy.png"));
copyButton.setIcon(copyIcon);// 载入图标
copyButton.addActionListener(new ActionListener() {// 按钮点击事件
public void actionPerformed(ActionEvent e) {
imagetoClipboard();// 将当前截图放入剪切板
disposeAll();// 销毁全部窗体
}
});
toolBar.add(copyButton);// 工具栏添加此按钮
mainPanel.add(toolBar, BorderLayout.NORTH);// 将工具放在容器南部
setContentPane(mainPanel);// 窗体加载主容器面板
pack();// 自动调整窗体大小
setVisible(true);// 显示窗体
}
}
/**
* 销毁所有截图窗体
*/
public void disposeAll() {
toolWindow.dispose();// 销毁工具栏窗体
dispose();// 销毁工具类窗体
}
public static void main(String[] args) {
new CaptureScreenUtil();
}
}
[源代码打包下载]
初级程序员
by: 随便取个名字 发表于:2017-09-22 20:52:55 顶(0) | 踩(0) 回复
膜拜大佬,我还以为是QQ...结果。。
回复评论