记录Springboot要在H5中使用手机端摄像头拍照存储Base64格式图片
前面把openssl配置好了,现在在手机端就可以输入https://ip:port访问我的应用客户端了,今天在测试的过程中发现一些问题。
问题一:手机端点开后发现是前置摄像头。
需要加个video的配置项,facingMode:{exact:"environment"} 这个加了之后,在pc端打开摄像头就会报错,暂时只能在手机上调测了。
问题二:Android手机页面展现跟PC端一样,但是IOS的镜头一打开铺满屏幕
在html的video标签中添加属性playsinline="true",这样镜头就在它该待的小框里了,
问题三:兼容问题
参考了网上的H5通过navigator.mediaDevices.getUserMedia调用手机摄像头_苹果无法调用摄像头 navigator.mediadevices-CSDN博客
想了一下,我的应用不商用,纯友情开发,并且只给固定的几个人用,还是不搞兼容了,等他们发现不兼容再来找我吧!!!
记录四 canvas画出图片的存储
canvas.draw后转为了Base64格式,赋值给<img>标签的src属性,在ajax 做post提交时再转为jsonArray传递出去。
在服务器中,接收图片的jsonarray数据,将base64转为图片文件存在本地文件夹。 将路径地址存储到数据库表字段里。
Base64与图片的格式互转,可以在网上搜一下,很多现成的例子,我这边用的是
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
apache的包,
import org.apache.commons.codec.binary.Base64;
代码参考:
html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | < div class="popup"> < p class="popup_title"> < em id="curPage" style="display: none"></ em > < em id="curCleanId" style="display: none"></ em > 请上传卫生检查不通过图片 </ p > < div class="popup_content"> < div > < video id="video" class="canvas" playsinline="true" autoplay="autoplay"></ video > < canvas id="canvas" class="canvas"></ canvas > </ div > </ div > < div > < img onclick="takePhoto()" style="height: 30px;width: 30px;float: left" src="takepic.png" > < div id="picDisplayDiv"> </ div > < button style="float: right;" onclick="hidePhotoPopup(1)">上传</ button > < button style="float: right;" onclick="hidePhotoPopup(0)">取消</ button > </ div > </ div >< br > |
js
function openMedia(){ let constraints = { video: { width: 120, height: 150, facingMode: { exact: "environment" } }, audio: false }; //获得video摄像头 let video = document.getElementById('video'); let promise = navigator.mediaDevices.getUserMedia(constraints); promise.then((mediaStream) => { // mediaStreamTrack = typeof mediaStream.stop === 'function' ? mediaStream : mediaStream.getTracks()[1]; mediaStreamTrack=mediaStream.getVideoTracks() video.srcObject = mediaStream; video.play(); }); } function takePhoto(){ let picArray=document.getElementById("picDisplayDiv").getElementsByTagName("img"); if(picArray.length>=3){ alert("当前仅支持上传3张图片"); return; } let video = document.getElementById('video'); let canvas = document.getElementById('canvas'); let ctx = canvas.getContext('2d'); ctx.drawImage(video, 0, 0, 80, 50); let img = document.getElementById('canvas').toDataURL(); $("#picDisplayDiv").append("<img style=\"height: 80px;width: 100px;float: left\" src='"+img+"'>"); ctx.clearRect(0, 0, 80, 50); } function hidePhotoPopup(operation){ if(operation==1)//上传 { queryUsageList($("#curPage").val(),"addFailCheckInfo",$("#curCleanId").val()); } closeMedia(); let picDisplayDiv=document.getElementById("picDisplayDiv"); picDisplayDiv.innerHTML=""; document.getElementById('video').srcObject = null; $("#takePic").hide(); } function closeMedia() { let stream = document.getElementById('video').srcObject; if (stream != null) { let tracks = stream.getTracks(); tracks.forEach(function (track) { track.stop(); }); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)