
这是在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},// successCallbackfunction (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();},// errorCallbackfunction (err) {$scope.errorPhoto();console.log("The following error occured:" + err);});} else {$scope.errorPhoto();}代码解析:{video: true,audio: true}调用成功即打开摄像头后返回视频流数据,我们可以将流数据设置到video标签在界面上实时显示图像。mediaStream用来记录获取到的流数据,track在Chrome浏览器中用来跟踪摄像头状态,这两个变量都能用来关闭摄像头。$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对象是我们项目中打开弹出层的一个对象,用来控制弹出层的显示。$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版本以上关闭摄像头的方式。app().registerService("h5TakePhotoService", function ($q, $uibModal) {this.photo = function () {var deferred = $q.defer();require([config.server + "/com/controllers/photo.js"], 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对象,最后处理返回的图像数据,设置数据显示到界面上。