| <body> |
| <video id="video" style="width: 400px"></video> |
| <canvas id="canvas" style="width: 400px"></canvas> |
| <br /> |
| <button type="button" onclick="takePicture()">Take Picture</button> |
| |
| |
| <script src="jsqr.js"></script> |
| <script> |
| function takePicture() { |
| navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' } }).then( |
| (stream) => { |
| |
| const video = document.getElementById('video'); |
| |
| |
| const canvas = document.getElementById('canvas'); |
| const ctx = canvas.getContext('2d'); |
| |
| video.muted = true; |
| video.setAttribute('playsinline', true); |
| |
| video.onloadedmetadata = () => { |
| canvas.width = video.videoWidth; |
| canvas.height = video.videoHeight; |
| draw(); |
| }; |
| video.srcObject = stream; |
| video.play(); |
| |
| const draw = () => { |
| ctx.drawImage(video, 0, 0, canvas.width, canvas.height); |
| const { data } = ctx.getImageData(0, 0, canvas.width, canvas.height); |
| |
| const code = jsQR(data, canvas.width, canvas.height); |
| |
| video.requestVideoFrameCallback(() => { |
| console.log(code); |
| if (code) { |
| |
| video.pause(); |
| video.srcObject.getTracks()[0].stop(); |
| return; |
| } |
| draw(); |
| }); |
| }; |
| }, |
| (error) => { |
| console.error(error); |
| } |
| ); |
| } |
| </script> |
| </body> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!