• js调用网络摄像头


    不支持IE浏览器(需要使用flash插件), 支持移动端, 未经过完全测试

    PC端使用的时候, HTML页面需要预留video标签, canvas标签

    移动端使用的时候, HTML页面需要预留file标签, canvas标签, img标签

    (function (window, document) {
        window.camera = {
            init: function (options) {
                /**
                 * options 属性示例
                 * videoID: video控件ID
                 * canvasID: canvas控件ID
                 * fileID: type为file的input控件的ID
                 * imageID: img控件的ID
                 * videoEnable: 是否启用摄像头
                 * audioEnable: 是否启用麦克风
                 * videoWidth: 视频宽度
                 * videoHeight: 视频高度
                 * photoWidth: 拍照宽度
                 * photoHeight: 拍照高度
                 */
    
                _options = options;
                if (isMobileTerminal()) {
                    initMobileTerminal();
                } else {
                    initComputerTerminal();
                }
            },
            photo: function () {
                if (isMobileTerminal()) {
                    photoMobileTerminal();
                } else {
                    photoComputerTerminal();
                }
            }
        };
    
        let _options = null;
    
        function initComputerTerminal() {
            let videoDom = document.getElementById(_options.videoID);
            if (!videoDom) {
                alert('Video 控件无效');
                return;
            }
    
            let canvasDom = document.getElementById(_options.canvasID);
            if (!canvasDom) {
                alert('Canvas 控件无效');
                return;
            }
            canvasDom.setAttribute('width', _options.photoWidth + 'px');
            canvasDom.setAttribute('height', _options.photoHeight + 'px');
    
            let parameters = {
                video: _options.videoEnable ? {
                     _options.videoWidth,
                    height: _options.videoHeight
                } : false,
                audio: _options.audioEnable
            };
    
            navigator.mediaDevices.getUserMedia(parameters)
                .then(function (MediaStream) {
                    video.srcObject = MediaStream;
                    video.play();
                }).catch(function (reason) {
                    console.log(reason);
                    alert(reason);
                });
        }
    
        function photoComputerTerminal() {
            let videoDom = document.getElementById(_options.videoID);
            if (!videoDom) {
                alert('Video 控件无效');
                return;
            }
    
    
            let canvasDom = document.getElementById(_options.canvasID);
            if (!canvasDom) {
                alert('Canvas 控件无效');
                return;
            }
    
            let context = canvasDom.getContext('2d');
            context.drawImage(videoDom, 0, 0, _options.photoWidth, _options.photoHeight);
        }
    
        function initMobileTerminal() {
            let fileDom = document.getElementById(_options.fileID);
            if (!fileDom) {
                alert('File 控件无效');
                return;
            }
    
            fileDom.setAttribute('accept', 'image/*');
            fileDom.setAttribute('capture', 'camera');
    
            let canvasDom = document.getElementById(_options.canvasID);
            if (!canvasDom) {
                alert('Canvas 控件无效');
                return;
            }
    
            canvasDom.setAttribute('width', _options.photoWidth + 'px');
            canvasDom.setAttribute('height', _options.photoHeight + 'px');
    
            let imageDom = document.getElementById(_options.imageID);
            if (!imageDom) {
                alert('Image 控件无效');
                return;
            }
    
            fileDom.addEventListener('change', function () {
                let file = fileDom.files[0];
                let reader = new FileReader();
                reader.onloadend = function () {
                    imageDom.setAttribute('src', reader.result);
    
                    setTimeout(function () {
                        let context = canvas.getContext("2d");
                        context.drawImage(imageDom, 0, 0, _options.photoWidth, _options.photoHeight);
                    }, 300);
                };
                reader.readAsDataURL(file);
            });
        }
    
        function photoMobileTerminal() {
            let fileDom = document.getElementById(_options.fileID);
            fileDom.click();
        }
    
        function isMobileTerminal() {
            if (/AppleWebKit.*Mobile/i.test(navigator.userAgent) || /Mobile/.test(navigator.userAgent) || /MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent))
                return /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent);
            return false;
        }
    })(window, document);
  • 相关阅读:
    P6665 [清华集训2016] Alice 和 Bob 又在玩游戏
    模板库
    CSP-S2021 游记
    CSP-S2021 SD迷惑行为大赏
    博弈论总结
    LOJ6033「雅礼集训 2017 Day2」棋盘游戏(二分图最大匹配必经点)
    LOJ6065「2017 山东一轮集训 Day3」第一题
    LOJ6059「2017 山东一轮集训 Day1」Sum
    LOJ6102「2017 山东二轮集训 Day1」第三题
    python笔记:字符编码
  • 原文地址:https://www.cnblogs.com/JosephBee/p/11090962.html
Copyright © 2020-2023  润新知