java截图工具的实现

编写一个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;
    }
}

总结:
程序虽然成功运行,能够对屏幕进行截屏操作,但由于经过两次截屏,截取的图片像素损失比较多,噪点也明显。并且程序没有设计出拖动鼠标截屏时绘制选区的功能。还需要后续的改进。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值