• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > AngularJS中使用HTML5摄像头拍照

AngularJS中使用HTML5摄像头拍照

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含AngularJS,HTML5等相关知识,匿名希望在学习及工作中可以帮助到您

  1. 项目背景

  公司开发一个网站,在做用户头像修改的时候领导提到增加一个由摄像头拍照实现修改头像的功能。因为我们网站是基于Html5进行开发,所以就直接采用H5来实现拍照。起初觉得这个功能很简单,但是做的时候才发现并不是那么简单的。

  这是在AngularJs中成功实现调用摄像头拍照并截图上传的例图:

  2. 如何调用摄像头

$scope.photoErr = false;
$scope.photoBtnDiable = true;
var mediaStream = null,track = null;

navigator.getMedia = (navigator.getUserMedia ||
                      navigator.webkitGetUserMedia || navigator.mozGetUserMedia ||
                      navigator.msGetUserMedia);
        if (navigator.getMedia) {
            navigator.getMedia(
           {
               video: true
           },
           // successCallback
           function (stream) {
               var s = window.URL.createObjectURL(stream);
               var video = document.getElementById('video');
               video.src = window.URL.createObjectURL(stream);
               mediaStream = stream;
               track = stream.getTracks()[0];
               $scope.photoBtnDiable = false;               $scope.$apply();
           },
           // errorCallback
           function (err) {
               $scope.errorPhoto();
               console.log("The following error occured:" + err);
           });
              } else {
            $scope.errorPhoto();
        }

  代码解析:

  navigator为浏览器对象,包含浏览器的信息,这里就是用这个对象打开摄像头。$scope为AndularJs语法。第一步声明navigator.getMedia来调用浏览器不同的打开摄像头函数,目前仅有getUserMedia、webkitGetUserMedia、mozGetUserMedia、msGetUserMedia四种方式分别对应通用浏览器、Google浏览器、火狐浏览器和IE浏览器,浏览器会自动判断调用哪一个函数。第二步是调用打开浏览器,包含三个参数,分别为需要使用的多媒体类型、获取成功返回的流数据处理函数以及操作失败返回错误消息处理函数。其中,使用时不仅可以设置视频还能设置使用麦克风,设置方式为:

{
      video: true,
      audio: true
}

  调用成功即打开摄像头后返回视频流数据,我们可以将流数据设置到video标签在界面上实时显示图像。mediaStream用来记录获取到的流数据,track在Chrome浏览器中用来跟踪摄像头状态,这两个变量都能用来关闭摄像头。

  3. 拍照

$scope.snap = function () {
        var canvas = document.createElement('canvas');
            canvas.width = "400";
            canvas.height = "304";

            var ctx = canvas.getContext('2d');
            ctx.drawImage(video, 0, 0, 400, 304);
            $scope.closeCamera();
            $uibModalInstance.close(canvas.toDataURL("image/png"));
};

  拍照时需要使用到canvas标签,创建一个canvas标签,设置我们需要拍照的尺寸大小,通过drawImage函数将video当前的图像保存到canvas标签,最后将图像数据转换为base64数据返回并关闭摄像头,这样就完成了我们的拍照功能。这里的$uibModalInstance对象是我们项目中打开弹出层的一个对象,用来控制弹出层的显示。

  4. 如何关闭摄像头

$scope.closeCamera = function () {
            if (mediaStream != null) {
                if (mediaStream.stop) {
                    mediaStream.stop();
                }
                $scope.videosrc = "";
            }
            if (track != null) {
                if (track.stop) {
                    track.stop();
                }
            }
        }

  正如前面所说,关闭摄像头的方式是通过mediaStream和track变量,只不过,track只能关闭Chrome浏览器中的摄像头,这也是Chrome 45版本以上关闭摄像头的方式。

  5. 集成到AndularJs

  事实上,前面所说的都是在AndularJs中实现的,当然,这里只是实现了拍照并返回拍照数据,我们想要在其他地方也使用,就需要将这部分独立出来,这里我们用到了AngularJs中的service机制,将这部分单独做成一个service并在项目中注入,然后就可以在其他地方调用了。

  service注册:

app().registerService("h5TakePhotoService", function ($q, $uibModal) {

        this.photo = function () {
            var deferred = $q.defer();
            require([config.server + "/com/controllers/photo.js?1.1.2"], function () {
                $uibModal.open({
                    templateUrl: config.server + "/com/views/modal_take_photo.html",
                    controller: "photoModalController",
                    windowClass: "modal-photo"
                }).result.then(function (e) {
                    deferred.resolve(e);
                });
            });
            return deferred.promise;
        }

    });


  调用方式:

$scope.takePhoto = function () {
      h5TakePhotoService.photo().then(function (res) {
           if (res != null && res != "") {
               $scope.myImage = res;
           }
      });
}

  h5TakePhotoService为控制器中注入的拍照service对象,最后处理返回的图像数据,设置数据显示到界面上。

  6. 兼容问题

  主要存在Chrome浏览器中,本地测试时,Chrome浏览器中能够正常使用,但是部署到服务器后就不能正常使用,报错消息为 [object NavigatorUserMediaError],这是因为Chrome浏览器在使用摄像头时只支持安全源访问,所以只能通过https访问才能正常使用。

  最后需要说一下,测试时只能通过http://url访问才能使用,不能通过file://url方式访问,即我们需要将代码部署才能访问,可以在Visual Studio、 java web、php中完成。

   原文:http://www.codeceo.com/article/angularjs-html5-take-photo.html

以上就是AngularJS中使用HTML5摄像头拍照的内容,更多相关内容请关注微课江湖()!

您可能想查找下面的文章:

  • angularjs的内存溢出怎么处理
  • AngularJS“路由”的简介及用法介绍
  • 详细介绍AngularJS中使用HTML5摄像头拍照的图文详情
  • angularJS适不适合做互联网金融产品?
  • 一个有 15 个页面的项目怎么规范 css 样式?
  • 有没人用 ionic + AngularJS + PhoneGap开发过HybridApp?
  • 目前流行的前端框架有哪些?
  • 在国内前端领域里优秀的人很多,为什么没人做出 angularjs 、jQuery 之类优秀的框架?
  • AngularJS中使用HTML5摄像头拍照

相关文章

  • 2018-12-03怎样使用phonegap查找联系人
  • 2018-12-03HTML5-canvas的使用方法介绍
  • 2018-12-03分享利用canvas实现知乎登录页的实例代码
  • 2018-12-03像素和CSS媒体查询?
  • 2017-08-06html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
  • 2018-12-03有关基础模板的课程推荐
  • 2018-12-03如何看待腾讯公司的X5浏览器内核?
  • 2017-08-06一款利用html5和css3动画排列人物头像的实例演示
  • 2018-12-03HTML5 CSS3新的WEB标准和浏览器支持_html5教程技巧
  • 2018-12-03html5 学习简单的拾色器 _html5教程技巧

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • h5canvas实现雪花飘落的特效代码
    • HTML5 Canvas draw方法制作动画效果示例
    • Html5 Canvas初探学习笔记(5) -绘图状态
    • 详细介绍HTML5的article和section的区别
    • html5draggable属性是如何做到页面拖动效果的?方法总结在这里!
    • HTML5.1 里的新东西
    • 一张图片能隐含千言万语之隐藏你的程序代码_html5教程技巧
    • 像“红杏”这样的HTML立体旋转效果是如何实现的?难度如何?
    • html5中转义实体字符,元数据, 跳转以及全局属性的图文详解
    • 详解HTML5 window.postMessage与跨域

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有