abstract:傳統(tǒng)方法如果想實(shí)現(xiàn)拍照功能,需要后臺(tái)應(yīng)用程序復(fù)雜的編寫(xiě),但隨著html5的發(fā)展,在HTML5規(guī)范的支持下,Web App已經(jīng)實(shí)現(xiàn)了手機(jī)上拍照功能,完全是使用HTML5技術(shù)完成。在下面,我將為大家講解Web App如何用手機(jī)進(jìn)行拍照,顯示在頁(yè)面上并上傳到服務(wù)器。首先拍照肯定是視頻流,HTML5中已經(jīng)可以實(shí)現(xiàn)獲取視頻流,主要使用getUserMedia()方法。1、 HTML5獲取視頻流HTML5 T
傳統(tǒng)方法如果想實(shí)現(xiàn)拍照功能,需要后臺(tái)應(yīng)用程序復(fù)雜的編寫(xiě),但隨著html5的發(fā)展,在HTML5規(guī)范的支持下,Web App已經(jīng)實(shí)現(xiàn)了手機(jī)上拍照功能,完全是使用HTML5技術(shù)完成。在下面,我將為大家講解Web App如何用手機(jī)進(jìn)行拍照,顯示在頁(yè)面上并上傳到服務(wù)器。
首先拍照肯定是視頻流,HTML5中已經(jīng)可以實(shí)現(xiàn)獲取視頻流,主要使用getUserMedia()方法。
1、 HTML5獲取視頻流
HTML5 The Media Capture API提供了對(duì)攝像頭的可編程訪問(wèn),用戶可以直接用getUserMedia獲得攝像頭提供的視頻流。我們需要做的是添加一個(gè)HTML5的Video標(biāo)簽,并將從攝像頭獲得視頻作為這個(gè)標(biāo)簽的輸入來(lái)源(請(qǐng)注意目前僅Chrome和Opera支持getUserMedia)。
XML/HTML
<videoidvideoid=”video”autoplay=”"></video> <script> varvideo_element=document.getElementById(‘video’); if(navigator.getUserMedia){//operashoulduseopera.getUserMedianow navigator.getUserMedia(‘video’,success,error); } functionsuccess(stream){ video_element.src=stream; } </script>
2、HTML5中拍照
拍照功能,我們采用HTML5的Canvas實(shí)時(shí)捕獲Video標(biāo)簽的內(nèi)容,Video元素能作為Canvas圖像的輸入,這一點(diǎn)很棒。主要代碼如下:
JavaScript var canvas=document.createElement('canvas'); var ctx=canvas.getContext('2d'); var cw=vw; var ch=vh; ctx.fillStyle=”#ffffff”; ctx.fillRect(0,0,cw,ch); ctx.drawImage(video_element,0,0,vvw,vvh,0,0,vw,vh); document.body.append(canvas);
3、HTML5獲取圖片
下面我們要從Canvas獲取圖片數(shù)據(jù),其核心思路是用canvas的toDataURL將Canvas的數(shù)據(jù)轉(zhuǎn)換為base64位編碼的PNG圖像,類似于“data:image/png;base64,xxxxx”的格式。
JavaScript var imgData=canvas.toDataURL(“image/png”);
因?yàn)檎嬲龍D像數(shù)據(jù)是base64編碼逗號(hào)之后的部分,所以我們實(shí)際服務(wù)器處理的圖像數(shù)據(jù)應(yīng)該是這部分,我們可以用兩種辦法來(lái)獲取。
第一種:是在前端截取22位以后的字符串作為圖像數(shù)據(jù),例如:
JavaScript Code復(fù)制內(nèi)容到剪貼板
var data=imgData.substr(22);
如果要在上傳前獲取圖片的大小,可以使用:
JavaScript Code復(fù)制內(nèi)容到剪貼板
var length=atob(data).length;//atobdecodesastringofdatawhichhasbeenencodedusingbase-64encoding
第二種:是在后端獲取傳輸?shù)臄?shù)據(jù)后用后臺(tái)語(yǔ)言截取22位以后的字符串。例如PHP里:
JavaScript
$image=base64_decode(str_replace(‘data:image/jpeg;base64,’,”,$data);
4、HTML5上傳圖片
在前端可以使用Ajax將上面獲得的圖片數(shù)據(jù)上傳到后臺(tái)腳本。例如使用jQuery時(shí):
JavaScript
$.post(‘upload.php’,{‘data’:data}); 在后臺(tái)我們用PHP腳本接收數(shù)據(jù)并存儲(chǔ)為圖片。
JavaScript
functionconvert_data($data){ $image=base64_decode(str_replace(‘data:image/jpeg;base64,’,”,$data); save_to_file($image); } functionsave_to_file($image){ $fp=fopen($filename,’w'); fwrite($fp,$image); fclose($fp); }
請(qǐng)注意,以上的解決方案不僅用于Web App拍照上傳,而且你可以實(shí)現(xiàn)把Canvas的輸出轉(zhuǎn)換為圖片上傳的功能。這樣你可以使用Canvas為用戶提供圖片編輯,例如裁剪、上色、涂鴉的畫(huà)板功能,然后把用戶編輯完的圖片保存到服務(wù)器上。