HTML5摄像头拍照组件的封装

摄像头调用主要使用了navigator.getUserMedia()函数。为了将摄像头的画像实时展现,可以将录像数据流导入到video或者canvas中。在展示的时候,建议使用video作为视频流容易,因为canvas绘画视频帧时存在一定的卡顿。
在像素数据分析和将画像转成图片,则应将视频流导到canvas中,使用canvas API中进行数据提取。

在这里,我使用了一个隐藏起来的canvas,对视频流的关键帧数据进行收集。

详看以下代码:

组件代码:


/**
 * 组件:调用摄像头拍摄的构造函数
 * @params {Object} options 参数如下:
 *         video  {DOM} video元素
 *         width  {Number} 画布宽度
 *         height  {Number} 画布高度
 *         onShoot  {Function} 录像回调函数
 *         onError  {Function} error回调函数
 * 调用:
 *     Camera.create(options);
 */
function Camera(options) {
    this.video = options.video;
    this.width = options.width || 640;
    this.height = options.height || 480;
    this.onError = options.onError;
    this.onShoot = options.onShoot;
}

Camera.prototype = {
    init: function() {
        navigator.getUserMedia = navigator.getUserMedia ||
            navigator.webkitGetUserMedia ||
            navigator.mozGetUserMedia ||
            navigator.msGetUserMedia;//获取媒体对象
        window.requestAnimFrame = (function(){
          return  window.requestAnimationFrame       ||
                  window.webkitRequestAnimationFrame ||
                  window.mozRequestAnimationFrame    ||
                  function( callback ){
                    window.setTimeout(callback, 1000 / 60);
                  };
        })();
        this.video.autoplay = 'ture';
        this.canvasDom = document.createElement('canvas');
        this.canvasDom.width = this.width;
        this.canvasDom.height = this.height;
        this.canvasDom.style.display = 'none';
        document.querySelector('body').appendChild(this.canvasDom);
    },

    // 检查摄像头是否可用
    canCameraUse: function() {
        return (navigator.getUserMedia && window.URL);
    },

    // 获取录像流到video中
    shoot: function() {
        var self = this;
        var video = self.video;
        if(self.canCameraUse) {
            navigator.getUserMedia(
                {video:true},
                function (stream) {
                    video.src = URL.createObjectURL(stream);
                    video.play();
                    video.addEventListener('error', function(error) {
                        stream.stop();
                        self.onError && self.onError(error);
                    }, false);
                },
                function (error) {
                    self.onError && self.onError(error);
                }
            );
        }
    },

    // 将录像绘制到canvas
    drawVideo: function() {
        var canvasDom = this.canvasDom;
        var ctx = canvasDom.getContext('2d');
        ctx.fillStyle = "#000000";
        ctx.fillRect(0, 0, canvasDom.width, canvasDom.height);
        ctx.drawImage(this.video, 0, 0, canvasDom.width, canvasDom.height);
    },

    // 录像事件绑定
    addShootEvent: function() {
        var self = this;
        var video = self.video;
        // 正在录像
        video.addEventListener('play', function() {
            function animation() {
                self.drawVideo();
                self.onShoot && self.onShoot();
                window.requestAnimationFrame(animation);
            }
        }, false);
    },

    // 将录像成图片
    snapshot: function(cb, imageType) {
        var self = this;
        var video = self.video;
        var canvas = self.canvasDom;
        var ctx = canvas.getContext('2d');
        imageType = imageType || 'png';
        imageSrc = canvas.toDataURL('image/' + imageType);
        cb && cb(imageSrc);
    },

    // 开始录像
    play: function() {
        this.video.play();
    },

    // 停止录像
    pause: function() {
        this.video.pause();
    },

    render: function() {
        this.init();
        this.shoot();
        this.drawVideo();
        this.addShootEvent();
    }
};

Camera.create = function(options) {
    var camera = new Camera(options);
    camera.render();
    return camera;
};

调用:

<!-- HTML -->
<video id='video'></video>
<div>
    <button id='shootBtn'>拍照</button>
</div>
<div id='imageBox'></div>


<!-- JS -->
<script>
    var camera = Camera.create({
        video: document.querySelector('#video'),
        width: 640,
        height: 480,
        onError: function(error) {
            alert(error);
        }
    });

    // 拍照
    document.querySelector('#shootBtn').addEventListener('click', function() {
        camera.snapshot(function(imageUrl) {
            var imageBox = document.querySelector('#imageBox');
            var image = imageBox.querySelector('img');
            if(!image) {
                var image = document.createElement('img');
                image.src = imageUrl;
                document.querySelector('#imageBox').appendChild(image);
            } else {
                image.src = imageUrl;
            }
        });
    }, false);
</script>

效果如下:

 

本文作者:子匠_Zijor,转载请注明出处:http://www.dengzhr.com/frontend/html/1335

大爷,请赏我点铜板买喵粮自己吃,您的支持将鼓励我继续创作!(支付宝)

shearphoto2.0 是HTML5头像截图插件拍照截图,JS截图,美工切图插件,能直接压缩数码相机图片进行截图!是互联网上写得最好的一个同类型插件 ShearPhoto 完美支持Linux Windows 服务器,国外空间等完美通过。 兼容IE6及所有浏览器,兼容PHP5.2X至PHP7.0! ShearPhoto拖动拉伸超准,超流畅,在互联网同类型软件绝对排行第一,除了shearphoto,你别无选择! JAVA用户请到http://git.oschina.net/alexyang/JFinal-shearphoto 下载 ------------------------------------------------------------------------ 从shearphoto 1.5直接跳跃到shearphoto 2.0,这是shearphoto重大革新。本来我是想shearphoto 1.6 、1.7、 1.8 慢慢升的,但是这样升级只会让shearphoto慢慢走向灭亡!结果我又辛苦了一个多星期,把shearphoto 2.0升级完成! shearphoto2.0之前,我认为没必要加入HTML5,兼容IE6 7 8就够。但是直到后来!我知道这是我一个错误的决定 因为用户并没有为shearphoto 1.5埋单,原因shearphoto 1.5没有HTML5截取,用户觉得会增加服务器负载!而且又不是本地加载图片!我一个错误的决定!导致用户份额一直没有明显大增。 shearphoto 2.0是收集所有用户的意见开发而成的! 重大的特性就是全面支持HTML5 1:支持translate3d 硬件加速移动 2:加入图片预览功能 3:加入了压缩数码相机图片, 以及HTML5 canvas本地切图,截图 但依然继续支持IE6 7 8 哦!有人问IE6 7 8不兼容HTML5啊,你骗人吗? 先不要急!shearphoto 2.0的机制是这样的:有HTML5则使用HTML5 canvas切图,截图,JS先会截取一张最合理化的截图,然后交给后端,根据用户设置,进行压缩截图 没有HTML5的浏览器则采用先上传再截取的策略,就是原先1.5的策略。 当然有些用户如果不喜欢HTML5,也可以根据接口自行关闭 4:加HTML5图片特效,就一如美图秀秀这样的特效!shearphoto一共提供14种漂亮特效,感谢腾讯AI对图片特效提供支持 shearphoto 2.0增添很多接口,大部份是HTML5的设置!请下载源码体验 shearphoto外忧内患,已经没退路了。在WEB截图界,shearphoto必须要干个第一!.shearphoto不再局限于头像截取,shearphoto更可用于商城的商品图片编辑。 shearphoto含HTML5图片压缩功能!一张十M 二十M的图,照样能帮你压成你要的容量和尺寸, 一般情况下!商城的商品图片都是通过数码相机拍摄后,要用PHOTOshop把数码相机内几十M的图片,压缩,截取,然后才能上传到商城服务器! 这样的操作是不是太麻烦了! 如果你使用shearphoto你就快捷很多了,shearphoto你只需要直接选择图片,就会帮你进行压缩截取,上传,添加到数据库。这样的一条龙服务! shearphoto 2.0的机制是无可挑剔的!但是不排除有BUG存在,如果用户遇到BUG情况,请到论坛 或官方QQ群进行反馈,我会第一时间发布补丁! shearphoto支持PHP和JAVA,JAVA由网友所写,但是JAVA版并不是太完善,使用的是以前的shearphoto1.3!我 一直很想把NET python nodejs JAVA的很完善地做出来! 可惜个人能力有限,如果你喜欢shearphoto,你又会玩 NET python nodejs JAVA,又想为互联网做贡献,那么你可以加入shearphoto团队,把这些后端版本做出来。但shearphoto没有薪水给你! shearphoto免费开源的,没有利润可图,纯粹是抱着为互联网做贡献的心态!如果你跟我一样,请加入到shearphoto后端开发 浏览器支持: 兼容IE 6 及以上的所有浏览器 后端支持: 支持PHP5.X 至 PHP7.0或以上 支持JAVA后端(shearphoto1.3开发) 系统支持: 支持linux WINDOW服务器 shearphoto采用原生JS + 原生PHP所写,绝对不含JQ插件,对JQ情有独忠的,这个插件不合适你 2015 年 9月 5 日 shearphoto作者:明哥先生 版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值