zoukankan      html  css  js  c++  java
  • java实现照相客户端功能

    前期系统中需要使用照相功能,在百度和同事的帮助下做出了一个简易版的项目,最近有时间整理一下,分享出来。
    这个项目实现起来也不是很复杂,不过所依赖的核心jar包比较大,我创建的是一个普通java project,没有创建maven工程,也可以使用maven,不过会引入大量使用不到的jar包。这个项目我已经放到GitHub上面了,文章末尾会给出地址,依赖的pom文件会一起放在项目中,方便查找。
    1.项目结构:
    在这里插入图片描述
    项目使用java的图形界面编程,需要一定的基础,不过也不是很难,主要是几个Listener的编写,TuPianJieQuActionListener是保存文件的主要监听类。

    2.jar包:
    在这里插入图片描述
    使用log4j-1.2.17.jar记录日志,commons-codec-1.13.jar是用来进行BASE64编码的,thumbnailator-0.4.8.jar可以便捷的实现图片压缩,其他的基本都是照相的核心jar包,如果使用maven创建会多出很多不需要的jar包,需要注意一下。

    3.TakePhoto照相核心类的实现:

    /**
     * 
     * @author jinghuaixin
     * @date 2019/11/28
     */
    public class TakePhoto {
        private static OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
        private static CanvasFrame canvas = null;
    
        private static Map<String, Object> map;
    
        public static void main(String[] args) {
            try {
                takePhoto();
            } catch (Exception | InterruptedException e) {
                e.printStackTrace();
                LogUtil.getLog().error("客户端照相异常!", e);
            }
        }
    
        public static void takePhoto() throws Exception, InterruptedException {
            int captureWidth = 640;
            int captureHeight = 480;
    
            OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
            grabber.setImageWidth(captureWidth);
            grabber.setImageHeight(captureHeight);
            try {
                grabber.start();
            } catch (Exception e) {
                LogUtil.getLog().error("照相客户端初始化异常!", e);
                JOptionPane.showMessageDialog(null, "摄像头准备失败:请检查摄像头是否正确接入!", "提示:", JOptionPane.WARNING_MESSAGE);
                if (grabber != null) {
                    grabber.close();
                }
                return;
            }
            // 开始获取摄像头数据
            canvas = new CanvasFrame("照相");
            // CanvasFrame canvas = new CanvasFrame("照相");//新建一个窗口
            canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            canvas.setAlwaysOnTop(true);
    
            Camera camera = new Camera();
            MyPanel shangChuanPanel = new MyPanel(canvas, map);
            // 增加按钮
            Container con = canvas.getContentPane();
    
            JPanel optionPanel = new JPanel();
            JButton btn_paiZhao = new JButton("拍照");
            JButton btn_chongPai = new JButton("重拍");
    
            JButton btn_guanBi = new JButton("关闭");
            JLabel info = new JLabel("<html><font color='red'>(连接成功!)</font></html>");
            JPanel bott = new JPanel();
            // 向面板添加按钮
            optionPanel.add(btn_chongPai, BorderLayout.NORTH);
            optionPanel.add(btn_paiZhao, BorderLayout.NORTH);
            optionPanel.add(btn_guanBi, BorderLayout.NORTH);
    
            con.add(optionPanel, BorderLayout.NORTH);
            bott.add(info, BorderLayout.SOUTH);
            con.add(bott, BorderLayout.SOUTH);
            JPanel east = new JPanel();
            east.setSize(new Dimension(600, 600));
            JLabel eastlabel = new JLabel(getSapce(220));
    
            if (shangChuanPanel != null) {
                east.add(shangChuanPanel, BorderLayout.SOUTH);
                shangChuanPanel.add(eastlabel);
    
                con.add(shangChuanPanel, BorderLayout.EAST);
    
            }
            // 添加监听事件
            PaiZhaoMouseListener pzListener = new PaiZhaoMouseListener(converter, grabber, camera, shangChuanPanel);
            btn_paiZhao.addMouseListener(pzListener);
            btn_guanBi.addMouseListener(new GuanBiMouseListener(canvas));
            btn_chongPai.addMouseListener(new ChongPaiMouseListener(camera));
            Frame grab = grabber.grab();
            shangChuanPanel.setMat(converter.convertToMat(grab));
            while (true) {
                if (!canvas.isDisplayable()) {// 窗口是否关闭
                    grabber.stop();// 停止抓取
                    // System.exit(2);//退出
                    break;
                }
                if (camera.getState()) {
                    grab = grabber.grab();// 获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
                }
                if (grab != null) {
                    canvas.showImage(grab);
                }
                Thread.sleep(50);// 50毫秒刷新一次图像
            }
        }
    
        /**
         * 扩展canvasFrame的右边空间
         * 
         * @param count
         * @return
         */
        public static String getSapce(int count) {
            count = count < 0 ? 0 : count;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < count; i++) {
                sb.append(" ");
            }
            return sb.toString();
        }
    
        /**
         * @return the canvas
         */
        public static CanvasFrame getCanvas() {
            return canvas;
        }
    
    }
    

    4.设备:
    实现照相你需要一个照相设备,使用USB摄像头就可以。

    5.项目演示:
    运行main方法,弹出拍照页面:
    在这里插入图片描述
    点击拍照按钮进行图片拍照,点击重拍按钮可以重新拍摄
    在这里插入图片描述
    红色方框可拖动,用于截取照片,选中合适的区域双击即可实现类似于截图的功能
    在这里插入图片描述
    现在看到的就是剪切以后的图片,点击上传即可保存到本地,上传按钮是因为实际应用中该项目使用WebSocket实现与浏览器通信,实现上传效果
    在这里插入图片描述
    保存后关闭页面去项目地址下即可发现刚刚的截图

    6.项目地址:
    java-简易拍照项目地址

    一颗安安静静的小韭菜。文中如果有什么错误,欢迎指出。
  • 相关阅读:
    主键为整型数据库设计
    raid1与raid5
    asp.net限时发送手机验证码
    利用jQuery与.ashx完成简单的Ajax
    Solr使用in语法查询
    Solr高效利用:Solr实现SQL的查询与统计
    lucene 的评分机制
    fastcgi配置
    安装elasticsearch及中文IK和近义词配置
    php多进程处理
  • 原文地址:https://www.cnblogs.com/c-Ajing/p/13448375.html
Copyright © 2011-2022 走看看