自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

AngularJS中使用HTML5攝像頭拍照

開發(fā) 前端
需要說(shuō)一下,測(cè)試時(shí)只能通過(guò)http://url訪問(wèn)才能使用,不能通過(guò)file://url方式訪問(wèn),即我們需要將代碼部署才能訪問(wèn),可以在Visual Studio、 java web、php中完成。

1. 項(xiàng)目背景

公司開發(fā)一個(gè)網(wǎng)站,在做用戶頭像修改的時(shí)候領(lǐng)導(dǎo)提到增加一個(gè)由攝像頭拍照實(shí)現(xiàn)修改頭像的功能。因?yàn)槲覀兙W(wǎng)站是基于Html5進(jìn)行開發(fā),所以就直接采用H5來(lái)實(shí)現(xiàn)拍照。起初覺(jué)得這個(gè)功能很簡(jiǎn)單,但是做的時(shí)候才發(fā)現(xiàn)并不是那么簡(jiǎn)單的。

 

[[162990]]

這是在AngularJs中成功實(shí)現(xiàn)調(diào)用攝像頭拍照并截圖上傳的例圖:

 

 

2. 如何調(diào)用攝像頭

  1. $scope.photoErr = false
  2. $scope.photoBtnDiable = true
  3. var mediaStream = null,track = null
  4.  
  5. navigator.getMedia = (navigator.getUserMedia || 
  6.                       navigator.webkitGetUserMedia || navigator.mozGetUserMedia || 
  7.                       navigator.msGetUserMedia); 
  8.         if (navigator.getMedia) { 
  9.             navigator.getMedia( 
  10.            { 
  11.                video: true 
  12.            }, 
  13.            // successCallback 
  14.            function (stream) { 
  15.                var s = window.URL.createObjectURL(stream); 
  16.                var video = document.getElementById('video'); 
  17.                video.src = window.URL.createObjectURL(stream); 
  18.                mediaStream = stream; 
  19.                track = stream.getTracks()[0]; 
  20.                $scope.photoBtnDiable = false;               $scope.$apply(); 
  21.            }, 
  22.            // errorCallback 
  23.            function (err) { 
  24.                $scope.errorPhoto(); 
  25.                console.log("The following error occured:" + err); 
  26.            }); 
  27.               } else { 
  28.             $scope.errorPhoto(); 
  29.         } 

代碼解析:

navigator為瀏覽器對(duì)象,包含瀏覽器的信息,這里就是用這個(gè)對(duì)象打開攝像頭。$scope為AndularJs語(yǔ)法。***步聲明 navigator.getMedia來(lái)調(diào)用瀏覽器不同的打開攝像頭函數(shù),目前僅有g(shù)etUserMedia、webkitGetUserMedia、 mozGetUserMedia、msGetUserMedia四種方式分別對(duì)應(yīng)通用瀏覽器、Google瀏覽器、火狐瀏覽器和IE瀏覽器,瀏覽器會(huì)自動(dòng) 判斷調(diào)用哪一個(gè)函數(shù)。第二步是調(diào)用打開瀏覽器,包含三個(gè)參數(shù),分別為需要使用的多媒體類型、獲取成功返回的流數(shù)據(jù)處理函數(shù)以及操作失敗返回錯(cuò)誤消息處理函 數(shù)。其中,使用時(shí)不僅可以設(shè)置視頻還能設(shè)置使用麥克風(fēng),設(shè)置方式為:

  1.       video: true, 
  2.       audio: true 

調(diào)用成功即打開攝像頭后返回視頻流數(shù)據(jù),我們可以將流數(shù)據(jù)設(shè)置到video標(biāo)簽在界面上實(shí)時(shí)顯示圖像。mediaStream用來(lái)記錄獲取到的流數(shù)據(jù),track在Chrome瀏覽器中用來(lái)跟蹤攝像頭狀態(tài),這兩個(gè)變量都能用來(lái)關(guān)閉攝像頭。

3. 拍照

  1. $scope.snap = function () { 
  2.         var canvas = document.createElement('canvas'); 
  3.             canvas.width = "400"
  4.             canvas.height = "304"
  5.  
  6.             var ctx = canvas.getContext('2d'); 
  7.             ctx.drawImage(video, 00400304); 
  8.             $scope.closeCamera(); 
  9.             $uibModalInstance.close(canvas.toDataURL("image/png")); 
  10. }; 

拍照時(shí)需要使用到canvas標(biāo)簽,創(chuàng)建一個(gè)canvas標(biāo)簽,設(shè)置我們需要拍照的尺寸大小,通過(guò)drawImage函數(shù)將video當(dāng)前的圖像保 存到canvas標(biāo)簽,***將圖像數(shù)據(jù)轉(zhuǎn)換為base64數(shù)據(jù)返回并關(guān)閉攝像頭,這樣就完成了我們的拍照功能。這里的$uibModalInstance 對(duì)象是我們項(xiàng)目中打開彈出層的一個(gè)對(duì)象,用來(lái)控制彈出層的顯示。

4. 如何關(guān)閉攝像頭

  1. $scope.closeCamera = function () { 
  2.             if (mediaStream != null) { 
  3.                 if (mediaStream.stop) { 
  4.                     mediaStream.stop(); 
  5.                 } 
  6.                 $scope.videosrc = ""
  7.             } 
  8.             if (track != null) { 
  9.                 if (track.stop) { 
  10.                     track.stop(); 
  11.                 } 
  12.             } 
  13.         } 

正如前面所說(shuō),關(guān)閉攝像頭的方式是通過(guò)mediaStream和track變量,只不過(guò),track只能關(guān)閉Chrome瀏覽器中的攝像頭,這也是Chrome 45版本以上關(guān)閉攝像頭的方式。

5. 集成到AndularJs

事實(shí)上,前面所說(shuō)的都是在AndularJs中實(shí)現(xiàn)的,當(dāng)然,這里只是實(shí)現(xiàn)了拍照并返回拍照數(shù)據(jù),我們想要在其他地方也使用,就需要將這部分獨(dú)立出 來(lái),這里我們用到了AngularJs中的service機(jī)制,將這部分單獨(dú)做成一個(gè)service并在項(xiàng)目中注入,然后就可以在其他地方調(diào)用了。

 

  1. service注冊(cè): 
  2.  
  3. app().registerService("h5TakePhotoService", function ($q, $uibModal) { 
  4.  
  5.         this.photo = function () { 
  6.             var deferred = $q.defer(); 
  7.             require([config.server + "/com/controllers/photo.js"], function () { 
  8.                 $uibModal.open({ 
  9.                     templateUrl: config.server + "/com/views/modal_take_photo.html"
  10.                     controller: "photoModalController"
  11.                     windowClass: "modal-photo" 
  12.                 }).result.then(function (e) { 
  13.                     deferred.resolve(e); 
  14.                 }); 
  15.             }); 
  16.             return deferred.promise; 
  17.         } 
  18.  
  19.     }); 

調(diào)用方式:

  1. $scope.takePhoto = function () { 
  2.       h5TakePhotoService.photo().then(function (res) { 
  3.            if (res != null && res != "") { 
  4.                $scope.myImage = res; 
  5.            } 
  6.       }); 

h5TakePhotoService為控制器中注入的拍照service對(duì)象,***處理返回的圖像數(shù)據(jù),設(shè)置數(shù)據(jù)顯示到界面上。

6. 兼容問(wèn)題

主要存在Chrome瀏覽器中,本地測(cè)試時(shí),Chrome瀏覽器中能夠正常使用,但是部署到服務(wù)器后就不能正常使用,報(bào)錯(cuò)消息 為 [object NavigatorUserMediaError],這是因?yàn)镃hrome瀏覽器在使用攝像頭時(shí)只支持安全源訪問(wèn),所以只能通過(guò) https訪問(wèn)才能正常使用。

***需要說(shuō)一下,測(cè)試時(shí)只能通過(guò)http://url訪問(wèn)才能使用,不能通過(guò)file://url方式訪問(wèn),即我們需要將代碼部署才能訪問(wèn),可以在Visual Studio、 java web、php中完成。

 

 

 

本文鏈接:http://www.codeceo.com/article/angularjs-html5-take-photo.html

 

責(zé)任編輯:王雪燕 來(lái)源: 碼農(nóng)網(wǎng)
相關(guān)推薦

2012-06-23 20:13:44

HTML5

2023-03-22 09:05:48

Linux舊相機(jī)網(wǎng)絡(luò)攝像頭

2009-08-21 17:11:05

C#攝像頭

2012-05-18 15:10:22

HTML5

2020-06-04 10:59:10

JavaScript開發(fā)技術(shù)

2021-03-11 10:21:55

特斯拉黑客網(wǎng)絡(luò)攻擊

2023-02-26 22:06:22

Electron瀏覽器開發(fā)

2013-03-21 09:56:09

2024-11-29 16:51:18

2017-06-20 11:45:52

2011-04-25 09:16:10

Windows 8

2013-01-18 10:59:44

IBMdW

2009-06-17 11:52:01

Linux

2009-08-21 17:24:18

C#控制攝像頭

2011-09-08 13:53:20

Linux攝像頭

2016-12-28 07:41:46

科技新聞早報(bào)

2011-05-12 09:01:29

HTML5

2012-05-03 08:08:34

Linux攝像頭

2014-07-16 13:36:30

MotionLinux監(jiān)控

2018-06-20 11:54:54

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)