h5调用摄像头实现拍照上传
2018-03-22 13:05:58
846次阅读
0个评论
项目中需要用到调用摄像头拍照并上传照片到后台
1,前端页面
<!-- 头像采集 -->
<div id = "part2" name = "part">
<div class="renxiang_box">
//左侧拍照区域
<div class="renxiang_left_box">
<video id="video" width="430" height="325" autoplay></video>
</div>
//采集到照片放入此区域
<div id = "gatherDiv" class="renxiang_center_box2">
<img id = "gather" src=""/>
</div>
//图形容器
<div id = "canvasDiv" class="renxiang_center_box">
<canvas id="canvas" width="430" height="325"></canvas>
</div>
<div class="renxiang_right_box">
<div class="renxiang_right_title_box">最近来访</div>
<div class="renxiang_right_box" id="pinjie"></div>
</div>
</div>
<div class="step_box">
<input type="button" value="下一步" class="step_button" onclick="next(2)" />
<input type="button" value="人证比对" class="step_button" onclick = "contrast()" />
<!--
<input type="button" value="人证比对" class="step_button" onclick = "next(2)" />
-->
<input type="button" value="拍照" id="snap" class="step_button" />
</div>
</div>
<div id ="part2-1" name = "part">
<div class="renxiang_duibi_box">
<div class="renxiang_duibi_left_box">
<div class="renxiang_duibi_left_picture_box">
<p class="renxiang_duibi_left_picture_box_p1">
<canvas id="canvas1" width="180" height="220"></canvas>
</p>
<p class="renxiang_duibi_left_picture_box_p2">
<img src="<%=basePath%>/css/skins/touch/images/default_photo.png"/>
</p>
</div>
<div class="renxiang_duibi_left_font_box">
<p class="renxiang_duibi_left_font_box_p1">现场照片</p>
<p class="renxiang_duibi_left_font_box_p2">证件照片</p>
</div>
<div class="renxiang_duibi_left_jieguo_box">
<p class="renxiang_duibi_left_jieguo_box_p1">人证比对相似度</p>
<p id = "xiangsidu"></p>
</div>
</div>
<div class="renxiang_duibi_right_box">
<div class="renxiang_duibi_right_title_box">黑名单库相似度比对</div>
<%if(true){//如果不是黑名单人员 %>
<div class="renxiang_duibi_right_none_icon_box"></div>
<div class="renxiang_duibi_right_none_font_box">此人不在黑名单库中</div>
<%}else{ %>
<div class="renxiang_duibi_right_picture_box">
<p class="renxiang_duibi_right_picture_box_p1"></p>
<p class="renxiang_duibi_right_picture_box_p2"><img src="<%=basePath%>/css/skins/touch/images/default_photo.png"/>91.52352%</p>
<p class="renxiang_duibi_right_picture_box_p2"><img src="<%=basePath%>/css/skins/touch/images/default_photo.png"/>89.34719%</p>
<p class="renxiang_duibi_right_picture_box_p2"><img src="<%=basePath%>/css/skins/touch/images/default_photo.png"/>85.16836%</p>
<p class="renxiang_duibi_right_picture_box_p1"></p>
</div>
<div class="renxiang_duibi_right_button_box">
<input type="button" value="停止办理" onclick = "logout()"/>
</div>
<%} %>
</div>
</div>
<div class="step_box">
<input type="button" value="下一步" class="step_button" onclick = "next(2);" />
</div>
</div>
JS代码
// Put event listeners into place(本地摄像头调用)
window.addEventListener("DOMContentLoaded", function() {
// Grab elements, create settings, etc.
var canvas = document.getElementById("canvas"),
context = canvas.getContext("2d"),//getContext唯一合法值2d
video = document.getElementById("video"),
videoObj = { "video": true },
errBack = function(error) {
console.log("Video capture error: ", error.code);
};
var canvas1 = document.getElementById("canvas1");
var context1 = canvas1.getContext("2d");//getContext唯一合法值2d
// Put video listeners into place
if(navigator.getUserMedia) { // Standard 如果用户允许打开摄像头
//stream为读取的视频流
navigator.getUserMedia(videoObj, function(stream) {
video.src = stream;
video.play();
}, errBack);
} else if(navigator.webkitGetUserMedia) { // WebKit-prefixed 根据不同的浏览器写法不同
navigator.webkitGetUserMedia(videoObj, function(stream){
video.src = window.webkitURL.createObjectURL(stream);
video.play();
}, errBack);
}
else if(navigator.mozGetUserMedia) { // Firefox-prefixed
navigator.mozGetUserMedia(videoObj, function(stream){
video.src = window.URL.createObjectURL(stream);
video.play();
}, errBack);
}
document.getElementById("snap").addEventListener("click", function() {
context1.drawImage(video, 0, 0, 180, 220); //drawImage方法:http://blog.csdn.net/u012193330/article/details/44996923
context.drawImage(video, 0, 0, 430, 325);
//将拍照的div显示,将采集的img隐藏
$("#gatherDiv").hide();
$("#canvasDiv").show();
UploadPic();
});
}, false);
//上传图片到后台
function UploadPic() {
// Generate the image data(将Canvas的内容保存为图片借助toDataURL来实现) 方法返回一个包含图片展示的 data URI 。
var Pic = document.getElementById("canvas").toDataURL("image/jpg");
//对其进行base64编 之后的字符串
Pic = Pic.replace(/^data:image\/(png|jpg);base64,/,"")
var IdCard=document.getElementById('userCode').value;
// Sending the image data to Server
$.ajax({
type: 'POST',
url: "<%=basePath%>/touch/touchIndexManager.do?method=uploadPic&type=0&IdCard="+IdCard,
data: { "imageData" : Pic},
success: function (msg) {
// alert("Done, Picture Uploaded.");
}
});
}
后台程序:
/**
* 上传拍摄的人脸照片
*/
public void uploadPic(){
try {
String idCard = request.getParameter("IdCard");
String type = request.getParameter("type");
String imgStr;//接收经过base64编 之后的字符串
response.setContentType("text/plain");
imgStr =request.getParameter("imageData");
if (imgStr == null) // 图像数据为空
return ;
BASE64Decoder decoder = new BASE64Decoder();
// Base64解码
byte[] b = decoder.decodeBuffer(imgStr);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
File file =new File(ConfigUtil.getPhotoFileAddr());
//如果文件夹不存在则创建
if (!file .exists() && !file .isDirectory()){
file .mkdir();
}
// 生成jpeg图片
String imgFilePath = "";
if(type.equals("0")){
imgFilePath = ConfigUtil.getPhotoFileAddr()+idCard+"_photo.jpg";// 新生成的图片
}else{
imgFilePath = ConfigUtil.getPhotoFileAddr()+idCard+".jpg";// 新生成的图片
}
OutputStream out = null;
try {
out = new FileOutputStream(imgFilePath);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.write(b);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
00
相关话题
- Vue2.0 移动端拍照压缩图片预览及上传
- Apache的commons-net实现FTP的文件上传下载
- Nginx的upstream支持的5种分配方式
- 文件流式上传
- 解决手机竖拍照片旋转90度问题
- SpringMVC流式上传文件
- SpringMVC使用StandardServletMultipartResolver上传文件
- SpringBoot设置上传文件大小
- Ajax跨域上传文件
- css实现下圆弧效果
- 前端图片压缩与上传OSS组件
- Servlet3.0原生API文件上传
- SpringMVC 配置servlet3.0 文件上传
- hls播放m3u8 添加header请求头,在请求ts的url上添加参数
- Redis实现分布式限流