编写一个java截图小程序。思路:
创建一个全屏的窗体,获取屏幕像素设置为窗体内容。再监听鼠标事件,根据鼠标在屏幕上移动的坐标点计算区域,再次获取屏幕像素,写到本地文件中。
代码分为两部分,具体如下:
ShotScreenMain.java
/**
* @author 明月依希
* 截屏主方法
*
*/
public class ShotScreenMain {
public static void main(String[] args) {
ShotScreenWin win = new ShotScreenWin();
}
}
ShotScreenWin.java
/**
* @author 明月依希
* 创建一个全屏的窗体,再去掉整个窗体的装饰,即取消关闭,最小/大化,
* 边框,并截取整个屏幕的像素,然后在窗体中显示。最后通过鼠标监听
* 事件,将制定区域的像素保存到桌面。
*
*/
public class ShotScreenWin extends JFrame{
private static final long serialVersionUID = 1L;
private Dimension d;//Dimension 类封装单个对象中组件的宽度和高度(精确到整数)
private JLabel imageLabel;//覆盖窗体的图片标签
private Point point_holder,point_release;//按下鼠标时的坐标与释放鼠标后的坐标,依此计算截屏区域
public ShotScreenWin() {
d = Toolkit.getDefaultToolkit().getScreenSize();//获取整个屏幕大小
setUndecorated(true);//禁用窗体装饰,不显示标题栏,关闭,最小化等
setSize(d);//设置窗体全屏
BufferedImage screenshot = snapShot(0,0,(int)d.getWidth(),(int)d.getHeight());//缓冲图片数据
imageLabel = new JLabel(new ImageIcon(screenshot));//根据图片缓冲构造图片,设为标签,使窗体即为全屏幕像素
add(imageLabel);//添加标签
addMouseListener(new ShotListenerMouse());//鼠标点击监听
// addMouseMotionListener(new ShotListenerMotion());//鼠标拖动监听,绘制选区。。。未完成
setVisible(true);//设置窗体为可见。默认不可见
}
/**
* 根据参数计算区域,实现截图并保存到桌面
* @param point_holder
* @param point_release
*/
private void snapShot(Point point_holder, Point point_release) {
// 获取屏幕数据的缓冲流
BufferedImage screen = snapShot(point_holder.x, point_holder.y, point_release.x - point_holder.x, point_release.y - point_holder.y);
String formatname = "jpg";//后缀名
// javascreen -- jsc
String filename="jsc"+System.currentTimeMillis()+"."+formatname;//设置图片文件名
// 注释掉对话框方法
// File dir = shotDialog(filename);
File dir = FileSystemView.getFileSystemView().getHomeDirectory();//桌面路径
File file = new File(dir,filename);//创建一个新 File 实例
System.out.print("图片:"+filename);
try {
// 使用支持给定格式的任意 ImageWriter 将一个图像写入 File。如果已经有一个 File 存在,则丢弃其内容
ImageIO.write(screen,formatname, file);//将图片保存到桌面
} catch (IOException e) {
e.printStackTrace();
}
System.out.print("\r...保存完毕!");
}
/**
* 获取屏幕区域的像素
* @param i 起始点x坐标
* @param j 起始点y坐标
* @param width 到达终点时宽度
* @param height 到达终点时高度
* @return
*/
private BufferedImage snapShot(int i, int j, int width, int height) {
BufferedImage screenshot = null;
try {
screenshot = (new Robot()).createScreenCapture(new
Rectangle(i,j,width,height));
} catch (AWTException e) {
e.printStackTrace();
}
return screenshot;
}
private class ShotListenerMouse implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
point_holder = e.getPoint();
System.out.println(point_holder.x+ "\r"+point_holder.y);
}
@Override
public void mouseReleased(MouseEvent e) {
point_release = e.getPoint();
snapShot(point_holder,point_release);
System.exit(0);
}
}
/**
* 暂未使用的方法
* 方法实现:保存图片时弹出对话框
* @param filename
* @return 文件路径
*/
private File shotDialog(String filename) {
if (System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") != -1){
try {
UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel");
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
File filedir = new File(filename);
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("保存");
chooser.setFileSelectionMode(2);
chooser.setSelectedFile(filedir);
int state = chooser.showDialog(null, "保存");
SwingUtilities.updateComponentTreeUI(chooser);
if (state == 0) {
filedir = chooser.getSelectedFile().getAbsoluteFile();
if (filedir == null)
{
Object[] options1 = { "确定", "取消" };
JOptionPane.showOptionDialog(null, "路径不存在,是否保存到默认位置:\n d:/xiaobai?",
"提示", 0, 1, null,
options1, options1[0]);
int sta = 0;
if (sta == 0) {
filedir = new File("d:\\xiaobai");
}
}
}
return filedir;
}
}
总结:
程序虽然成功运行,能够对屏幕进行截屏操作,但由于经过两次截屏,截取的图片像素损失比较多,噪点也明显。并且程序没有设计出拖动鼠标截屏时绘制选区的功能。还需要后续的改进。