1. 程式人生 > >如何使用HTML5實現拍照上傳應用

如何使用HTML5實現拍照上傳應用

        在HTML5規範的支援下,WebApp在手機上拍照已經成為可能。在下面,我將講解Web App如何用手機進行拍照,顯示在頁面上並上傳到伺服器。

1、  視訊流

        HTML5 The Media Capture API提供了對攝像頭的可程式設計訪問,使用者可以直接用getUserMedia獲得攝像頭提供的視訊流。我們需要做的是新增一個HTML5的Video標籤,並將從攝像頭獲得視訊作為這個標籤的輸入來源(請注意目前僅Chrome和Opera支援getUserMedia。補充:請使用Opera支援HTML5的新版本,如果是Chrome,版本需為Chrome 18.0.1008+,並使用about:flags來開啟WebRTC,請看下圖

)。


<video id="video" autoplay=""></video>
<script>
var video_element = document.getElementById('video');
if (navigator.getUserMedia) { // opera should use opera.getUserMedia now, chrome use webkitGetUserMedia
         navigator.getUserMedia('video',success, error);
}
function success(stream) {
         video_element.src =stream;
}
</script>
視訊流2、  拍照

        拍照功能,我們採用HTML5的Canvas實時捕獲Video標籤的內容,Video元素能作為Canvas影象的輸入,這一點很棒。主要程式碼如下:

<script>
         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);
</script>

3、  圖片獲取

        下面我們要從Canvas獲取圖片資料,其核心思路是用canvas的toDataURL將Canvas的資料轉換為base64位編碼的PNG影象,類似於“data:image/png;base64,xxxxx”的格式。

var imgData =canvas.toDataURL("image/png");

        因為真正影象資料是base64編碼逗號之後的部分,所以我們實際伺服器處理的影象資料應該是這部分,我們可以用兩種辦法來獲取。

        第一種:是在前端擷取22位以後的字串作為影象資料,例如:

var data = imgData.substr(22);

        如果要在上傳前獲取圖片的大小,可以使用:

var length = atob(data).length;// atob decodes a string of data which has been encoded using base-64 encoding

        第二種:是在後端獲取傳輸的資料後用後臺語言擷取22位以後的字串。例如PHP裡:

$image = base64_decode( str_replace('data:image/jpeg;base64,', '',$data);

4、  圖片上傳

        在前端可以使用Ajax將上面獲得的圖片資料上傳到後臺指令碼。例如使用jQuery時:

$.post('upload.php',{ 'data' : data } );

        在後臺我們用PHP指令碼接收資料並存儲為圖片。

function convert_data($data){
    $image = base64_decode( str_replace('data:image/jpeg;base64,', '',$data);
    save_to_file($image);
}
function save_to_file($image){   
    $fp = fopen($filename, 'w');
    fwrite($fp, $image);
    fclose($fp);
}

        請注意,以上的解決方案不僅能用於Web App拍照上傳,並且你可以實現把Canvas的輸出轉換為圖片上傳的功能。這樣你可以使用Canvas為使用者提供圖片編輯,例如裁剪、上色、塗鴉的畫板功能,然後把使用者編輯完的圖片儲存到伺服器上。


Canvas塗鴉功能

        在HTML5的驅動下,Web App與Native App之間是否還有不可逾越的鴻溝?我將會在3月23日百度開發者大會上現場來解答這個問題,敬請期待。

        相關規範:

        相關The Media Capture示例:

        原創文章,轉載請標明出處:蔣宇捷的專欄