cordova
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序定制開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了樅陽(yáng)免費(fèi)建站歡迎大家使用!
用代碼調(diào)用硬件,這里面有個(gè)方法可以調(diào)用手機(jī)的攝像頭,里面我記得還有個(gè)功能查看手機(jī)相冊(cè)
最簡(jiǎn)單的可以用position定位,盒子的是relative,照片的是absolute,然后分別調(diào)整圖片的top,left,bottom,right,調(diào)到你覺(jué)得合適的位置。
1、實(shí)現(xiàn)頭的方法代碼。
2、編寫(xiě)CSS樣式的方法代碼。
3、html上傳代碼。
4、JS處理方法代碼。
5、測(cè)試結(jié)果如下。
注意事項(xiàng):
JavaScript是一種網(wǎng)絡(luò)腳本語(yǔ)言,在web應(yīng)用開(kāi)發(fā)中得到了廣泛的應(yīng)用,它經(jīng)常被用來(lái)為網(wǎng)頁(yè)添加各種動(dòng)態(tài)功能,為用戶提供更加流暢美觀的瀏覽效果,通常JavaScript腳本被嵌入到HTML中來(lái)實(shí)現(xiàn)自己的功能。
HTML5技術(shù)支持WebApp在手機(jī)上拍照,顯示在頁(yè)面上并上傳到服務(wù)器。這是手機(jī)微博應(yīng)用中常見(jiàn)的功能,當(dāng)然你也可以在其它類型應(yīng)用中適當(dāng)使用此技術(shù)。
1、 視頻流
HTML5 的 The Media Capture(媒體捕捉) API 提供了對(duì)攝像頭的可編程訪問(wèn),用戶可以直接用 getUserMedia(請(qǐng)注意目前僅Chrome和Opera支持)獲得攝像頭提供的視頻流。我們需要做的是添加一個(gè)HTML5 的 Video 標(biāo)簽,并將從攝像頭獲得的視頻作為這個(gè)標(biāo)簽的輸入來(lái)源。
video id=”video” autoplay=”"/video
script
var video_element=document.getElementById(‘video’);
if(navigator.getUserMedia){ // opera應(yīng)使用opera.getUserMedianow
navigator.getUserMedia(‘video’,success,error); //success是回調(diào)函數(shù),當(dāng)然你也可以直接在此寫(xiě)一個(gè)匿名函數(shù)
}
function success(stream){
video_element.src=stream;
}
/script
此時(shí),video 標(biāo)簽內(nèi)將顯示動(dòng)態(tài)的攝像視頻流。下面需要進(jìn)行拍照了。
2、 拍照
拍照是采用HTML5的Canvas功能,實(shí)時(shí)捕獲Video標(biāo)簽的內(nèi)容,因?yàn)閂ideo元素可以作為Canvas圖像的輸入,所以這一點(diǎn)很好實(shí)現(xiàn)。主要代碼如下:
var canvas=document.createElement(‘canvas’); //動(dòng)態(tài)創(chuàng)建畫(huà)布對(duì)象
var ctx=canvas.getContext(’2d’);
var cw=vw,ch=vh;
ctx.fillStyle=”#ffffff”;
ctx.fillRect(0,0,cw,ch);
ctx.drawImage(video_element,0,0,cw,ch,0,0,vw,vh); //將video對(duì)象內(nèi)指定的區(qū)域捕捉繪制到畫(huà)布上指定的區(qū)域,可進(jìn)行不等大不等位的繪制。
document.body.append(canvas);
3、 圖片獲取
從Canvas獲取圖片數(shù)據(jù)的核心思路是用canvas的toDataURL將Canvas的數(shù)據(jù)轉(zhuǎn)換為base64位編碼的PNG圖像,類似于“data:image/png;base64,xxxxx”的格式。
var imgData=canvas.toDataURL(“image/png”);
這樣,imgData變量就存儲(chǔ)了一長(zhǎng)串的字符數(shù)據(jù)內(nèi)容,表示的就是一個(gè)PNG圖像的base64編碼。因?yàn)檎嬲膱D像數(shù)據(jù)是base64編碼逗號(hào)之后的部分,所以要讓實(shí)際服務(wù)器接收的圖像數(shù)據(jù)應(yīng)該是這部分,我們可以用兩種辦法來(lái)獲取。
第一種:是在前端截取22位以后的字符串作為圖像數(shù)據(jù),例如:
var data=imgData.substr(22);
如果要在上傳前獲取圖片的大小,可以使用:
var length=atob(data).length; //atob 可解碼用base-64解碼的字串
第二種:是在后端獲取傳輸?shù)臄?shù)據(jù)后用后臺(tái)語(yǔ)言截取22位以后的字符串(也就是在前臺(tái)略過(guò)上面這步直接上傳)。例如PHP里:
$image=base64_decode(str_replace(‘data:image/jpeg;base64,’,”,$data);
4、 圖片上傳
在前端可以使用Ajax將上面獲得的圖片數(shù)據(jù)上傳到后臺(tái)腳本。例如使用jQuery時(shí)可以用:
$.post(‘upload.php’,{‘data’:data});
在后臺(tái)我們用PHP腳本接收數(shù)據(jù)并存儲(chǔ)為圖片。
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拍照上傳,也可以通過(guò)Canvas的編輯功能函數(shù)提供圖片編輯,例如裁剪、上色、涂鴉、圈點(diǎn)等功能,然后把用戶編輯完的圖片上傳保存到服務(wù)器上。
在還在不斷補(bǔ)充修正的HTML5的驅(qū)動(dòng)下,Web App與Native App之間的距離將越來(lái)越小。在可預(yù)見(jiàn)的不遠(yuǎn)的未來(lái),越來(lái)越多老的和新的開(kāi)發(fā)項(xiàng)目必將會(huì)遷移到WEB應(yīng)用上來(lái)。
相關(guān)規(guī)范:
(為便于閱讀,對(duì)原文進(jìn)行了不失原意的適當(dāng)修改,包括代碼中一些錯(cuò)誤的重復(fù),并作了注釋)
HTML5技術(shù)支持WebApp在手機(jī)上拍照,顯示在頁(yè)面上并上傳到服務(wù)器。這是手機(jī)微博應(yīng)用中常見(jiàn)的功能,當(dāng)然你也可以在其它類型應(yīng)用中適當(dāng)使用此技術(shù)。
1、 視頻流
HTML5 的 The Media Capture(媒體捕捉) API 提供了對(duì)攝像頭的可編程訪問(wèn),用戶可以直接用 getUserMedia(請(qǐng)注意目前僅Chrome和Opera支持)獲得攝像頭提供的視頻流。我們需要做的是添加一個(gè)HTML5 的 Video 標(biāo)簽,并將從攝像頭獲得的視頻作為這個(gè)標(biāo)簽的輸入來(lái)源。
video id=”video” autoplay=”"/video
script
var video_element=document.getElementById(‘video’);
if(navigator.getUserMedia){ // opera應(yīng)使用opera.getUserMedianow
navigator.getUserMedia(‘video’,success,error); //success是回調(diào)函數(shù),當(dāng)然你也可以直接在此寫(xiě)一個(gè)匿名函數(shù)
}
function success(stream){
video_element.src=stream;
}
/script
此時(shí),video 標(biāo)簽內(nèi)將顯示動(dòng)態(tài)的攝像視頻流。下面需要進(jìn)行拍照了。
2、 拍照
拍照是采用HTML5的Canvas功能,實(shí)時(shí)捕獲Video標(biāo)簽的內(nèi)容,因?yàn)閂ideo元素可以作為Canvas圖像的輸入,所以這一點(diǎn)很好實(shí)現(xiàn)。主要代碼如下:
var canvas=document.createElement(‘canvas’); //動(dòng)態(tài)創(chuàng)建畫(huà)布對(duì)象
var ctx=canvas.getContext(’2d’);
var cw=vw,ch=vh;
ctx.fillStyle=”#ffffff”;
ctx.fillRect(0,0,cw,ch);
ctx.drawImage(video_element,0,0,cw,ch,0,0,vw,vh); //將video對(duì)象內(nèi)指定的區(qū)域捕捉繪制到畫(huà)布上指定的區(qū)域,可進(jìn)行不等大不等位的繪制。
document.body.append(canvas);
3、 圖片獲取
從Canvas獲取圖片數(shù)據(jù)的核心思路是用canvas的toDataURL將Canvas的數(shù)據(jù)轉(zhuǎn)換為base64位編碼的PNG圖像,類似于“data:image/png;base64,xxxxx”的格式。
var imgData=canvas.toDataURL(“image/png”);
這樣,imgData變量就存儲(chǔ)了一長(zhǎng)串的字符數(shù)據(jù)內(nèi)容,表示的就是一個(gè)PNG圖像的base64編碼。因?yàn)檎嬲膱D像數(shù)據(jù)是base64編碼逗號(hào)之后的部分,所以要讓實(shí)際服務(wù)器接收的圖像數(shù)據(jù)應(yīng)該是這部分,我們可以用兩種辦法來(lái)獲取。
第一種:是在前端截取22位以后的字符串作為圖像數(shù)據(jù),例如:
var data=imgData.substr(22);
如果要在上傳前獲取圖片的大小,可以使用:
var length=atob(data).length; //atob 可解碼用base-64解碼的字串
第二種:是在后端獲取傳輸?shù)臄?shù)據(jù)后用后臺(tái)語(yǔ)言截取22位以后的字符串(也就是在前臺(tái)略過(guò)上面這步直接上傳)。例如PHP里:
$image=base64_decode(str_replace(‘data:image/jpeg;base64,’,”,$data);
4、 圖片上傳
在前端可以使用Ajax將上面獲得的圖片數(shù)據(jù)上傳到后臺(tái)腳本。例如使用jQuery時(shí)可以用:
$.post(‘upload.php’,{‘data’:data});
在后臺(tái)我們用PHP腳本接收數(shù)據(jù)并存儲(chǔ)為圖片。
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拍照上傳,也可以通過(guò)Canvas的編輯功能函數(shù)提供圖片編輯,例如裁剪、上色、涂鴉、圈點(diǎn)等功能,然后把用戶編輯完的圖片上傳保存到服務(wù)器上。
在還在不斷補(bǔ)充修正的HTML5的驅(qū)動(dòng)下,Web App與Native App之間的距離將越來(lái)越小。在可預(yù)見(jiàn)的不遠(yuǎn)的未來(lái),越來(lái)越多老的和新的開(kāi)發(fā)項(xiàng)目必將會(huì)遷移到WEB應(yīng)用上來(lái)。
//簡(jiǎn)單實(shí)例?用html5?拍攝照片?平在照片上實(shí)時(shí)標(biāo)注GPS?并上傳到服務(wù)器?存入數(shù)據(jù)庫(kù)
//需要?gumwrapper.min.js?支持
function?opencam(){
//alert?("opencam");
if?(cam_is_open==0){
var?video_html='video?id="myVideo"?width="320"?height="240"?/video';
$("#web_cam").html(video_html);//動(dòng)態(tài)加入一個(gè)video元素
$("#web_cam").show();????
function?showSuccess(video)?{
//?alert('Hey,?it?works!?Dimensions:?'?+?video.videoWidth?+?'?x?'?+?video.videoHeight);
}
function?showError(error)?{
alert('Oops:?'?+?error.message);
}
gum?=?new?GumWrapper({video:?'myVideo'},?showSuccess,?showError);
gum.play();
cam_is_open=1;
$("#opencam_btn").attr("value","關(guān)閉鏡頭");
}else{
location.reload();
}????
}
function?short_cam(){
$("#photo_div").show();
$("#msg_tips").text("正在生成圖片");
var?now?=?new?Date();
var?cur_time=(now.getHours()10?"0":"")+now.getHours()+":";
cur_time+=(now.getMinutes()10?"0":"")+now.getMinutes()+":";
cur_time+=(now.getSeconds()10?"0":"")+now.getSeconds();
? send_time=now.getFullYear()+"-"+((now.getMonth()+1)10?"0":"")+(now.getMonth()+1)+"-"+(now.getDate()10?"0":"")+now.getDate();
send_time+="?"+cur_time;
send_lon=$("#cur_lon").text();
??send_lat=$("#cur_lat").text();
var?video_cam=document.getElementById("myVideo");
var?canvasobj=document.getElementById("photo_canvas");
var?ct1=canvasobj.getContext('2d');
ct1.fillStyle="#ffffff";
ct1.fillRect(0,0,640,480);
ct1.drawImage(video_cam,0,0);
ct1.font="25px?Georgia";
ct1.fillStyle="#ff4444";
ct1.fillText(send_time,10,50);
ct1.fillText("緯度:"+?send_lat,10,80);
ct1.fillText("經(jīng)度:"+?send_lon,10,110);
var?img_data=canvasobj.toDataURL("mage/png");
var?imgobj=document.getElementById("cur_img");
imgobj.src=img_data;
$("#web_cam").hide();
$("#msg_tips").text("生成圖片完成");
}
?? function?reshort_photo(){
$("#photo_div").hide();
$("#web_cam").show();
}
function?send_photo()?{
$("#msg_tips").text("圖片上傳中");
?var? imgobj=document.getElementById("cur_img").src;
?//alert?(imgobj);
?$.ajax({
? type:"post",
url:"updategpsp.php",
async:true,
dataType:"text",
data:{img_data:imgobj,send_time:send_time,
rel_lat:rel_lat,rel_lon:rel_lon,
send_lat:send_lat,send_lon:send_lon},
success:?function(msg){
if?(msg=1){
$("#msg_tips").text("圖片上傳完畢");
alert("上傳數(shù)據(jù)成功");
reshort_photo();
}else{
alert("上傳數(shù)據(jù)失??!?請(qǐng)重新傳送");
alert(msg);
}
}
?});
}
html文件
!DOCTYPE?html
html?lang="en"
head
meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8"?/
meta?name="viewport"?content="width=device-width,?user-scalable=yes"
titlewebcap?Test/title
style
body,?html,#main_div{width:?100%;height:?100%;overflow:?hidden;margin:0;}
#float_div{position:?absolute;top:?5px;?left:25px?border-right:?activeborder?1px?solid;
?border-top:?activeborder?1px?solid;?border-left:?activeborder?1px?solid;
?border-bottom:?activeborder?1px?solid;?z-index:9999,width:?300px;height:?auto;?
?overflow:?hidden}
#web_cam{width:320px;?height:240px;?}
#ctrl_bar_div{width:auto;?height:auto;
border:1px?dotted?blue;?margin:0px;
padding:3px;}
.span1{background-color:#afa;?}
#cur_img{width:320px;?height:240px;}
#msg_tips{color:red;background-color:#afa;}
#allmap?{width:?auto;height:?100%;overflow:?hidden;margin:0;font-family:"微軟雅黑";}
/style
script?type="text/javascript"?src="../js/jquery.min.js"/script
script?src="./js/gumwrapper.min.js"/script
script?src="../js/Float_math.js"/script
script?type="text/javascript"?src=";ak=自己申請(qǐng)的授權(quán)碼"/script
script?src="./js/testhtml5.js"/script
script?type="text/javascript"?
var?gps_star=0;
var?lat_offset=1.0001390158;
var?lon_offset=1.0001029614;
var?bm;
var?old_Position;
var?cur_marker;
var?prive_position;
var?cam_is_open=0;?//記錄鏡頭的打開(kāi)狀態(tài)?,?默認(rèn)為沒(méi)有開(kāi)?狀態(tài)=0
var?gum;
var?send_time="";
var?send_lat="";
var?send_lon="";
var?rel_lat="";
var?rel_lon="";
var?cur_offset_zt=0;
//alert?(cur_marker);
$(document).ready(function()?{
drawbaiduMap();???
bm.centerAndZoom("東莞",18);?
});
/script
/head
body
div?id="main_div"
???div?id="allmap"/div
/div
div?id="float_div"
div?id="ctrl_bar_div"
span?class="span1"???緯度:/span
span?class="span1"?id="cur_lat"?000.000000?/span
span??class="span1"??經(jīng)度:/span
span?class="span1"?id="cur_lon"?000.000000?/span
input?id="is_ver_off_set"?type="button"?onclick="ver_offset_zt()"?value="校正"?/
br
input?id="gps_btn"?type="button"?value="開(kāi)\關(guān)GPS"?onclick="getLocation()"/
input?id="opencam_btn"?type="button"?value="打開(kāi)鏡頭"??onclick="opencam()"/
span??id="msg_tips"GPS狀態(tài):關(guān)閉span
/div
div?id="web_cam"??style="display:none"?onclick="set_timeout_short()"?
/div
div?id="photo_div"?style="display:none"
div?id="send_btn_div"
input?id="res_hort_btn"?type="button"?value="重拍"?onclick="reshort_photo()"/
input?id="send_photo_btn"?type="button"?value="發(fā)送"?onclick="send_photo()"/
input?id="canc_btn"?type="button"?value="取消"?onclick="can_photo()"/
/div
div?id="canvas_div"?style="display:none"
canvas?id="photo_canvas"?width="640"?height="480"??
"不支持"
/canvas
/div
div?id="img_div"
img?id="cur_img"/
/div
/div
/div
/body
/html