首页 > 其他分享 >记录H5中使用手机端摄像头拍照存储Base64格式图片

记录H5中使用手机端摄像头拍照存储Base64格式图片

时间:2024-01-04 14:11:12浏览次数:40  
标签:function Base64 H5 getElementById let video document 摄像头 mediaStream

前面把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> apache的包, import org.apache.commons.codec.binary.Base64;  

代码参考:

html

 <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>

  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();
        });
    }
}

 

标签:function,Base64,H5,getElementById,let,video,document,摄像头,mediaStream
From: https://www.cnblogs.com/wolf-python-lily/p/17945122

相关文章

  • 数字化景区网络设备及摄像头故障诊断与视频画面分析系统
    一、引言    随着数字化技术的快速发展,越来越多的景区开始进行数字化升级,以提升游客体验、提高运营效率及增加景区收入。然而,随着设备数量的增加,如何高效地进行故障诊断和视频画面分析成为了一个重要的问题。本方案旨在解决这一问题,通过构建一个高效的故障诊断与视频画面分......
  • MD5三种方式加密(16位大小、32位大小),Base64两种方式加解密
    MD5加密后的位数有两种:16位与32位。16位实际上是从32位字符串中取中间的第9位到第24位的部分,用Java语言来说,即:Stringmd5_16=md5_32.substring(8,24)Java实现md5加密有三种方式可供选择1.Spring自带DigestUtils(优点,方便,代码简洁,缺点只可进行MD5加密)spring自带jar包......
  • 10PCIE摄像头图像采集卡
    软件版本:vitis2021.1(vivado2021.1)操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!10.1概述本方案使用自定义AXI4IPFDMA实现摄像头图像采集和播放,本方案学习内容和"PCIE图像采集卡HDMI输入"基本一......
  • 浏览器原生支持JS Base64编码解码
    1.Base64解码:vardecodedData=window.atob('内容');2.Base64编码:varencodedData=window.btoa('base64编码内容');3.中文转换报错?若中文Base64数据转换有报错问题,可以中文先encode转码和decode编码,示例如下:3.1使用:window.btoa(window.encodeURIComponent('内......
  • python opencv保存摄像头视频
    要使用Python和OpenCV将摄像头视频保存为.mp4格式,您需要使用cv2.VideoWriter的fourcc参数指定视频编码器。在大多数情况下,使用cv2.VideoWriter_fourcc(*'mp4v')将视频保存为.mp4格式是一个好选择。以下是一个示例代码: python复制importcv2 #0代表的是电脑上的默认摄像头......
  • 网络摄像头漏洞扫描工具 Ingram
    简介主要针对网络摄像头的漏洞扫描框架,目前已集成海康、大华、宇视、dlink等常见设备安装请在Linux或Mac系统使用,确保安装了3.8及以上版本的Python,尽量不要使用3.11,因为对许多包的兼容不是很好克隆该仓库:gitclonehttps://github.com/jorhelp/Ingram.git进入项目......
  • H5前端特殊艺术字体文件太大,可通过font-spider压缩
    原理:1.爬行本地html文档,分析所有css语句2.记录@font-face语句声明的字体,并且记录使用该字体的css选择器3.通过css选择器的规则查找当前html文档的节点,记录节点上的文本4.找到字体文件并删除没被使用的字符5.编码成跨平台使用的字体格式简而言之:就是爬出你项目中......
  • uniapp打包h5中的input disabled问题
    uniapp打包h5后,input如果加了disabled属性,那么在360浏览器上@click事件不生效<inputtype="text"class="input"placeholder="请选择":value="type_name":disabled="true"@click="showType">可以换成view元素显内容和点击事件<viewclas......
  • uniapp打包h5中的input disabled问题
    uniapp打包h5后,input如果加了disabled属性,那么在360浏览器上@click事件不生效<inputtype="text"class="input"placeholder="请选择":value="type_name":disabled="true"@click="showType">可以换成view元素显内容和点击事件<viewclas......
  • [转]编码算法(URL编码和Base64编码)
    原文地址:编码算法-廖雪峰的官方网站要学习编码算法,我们先来看一看什么是编码。ASCII码就是一种编码,字母A的编码是十六进制的0x41,字母B是0x42,以此类推:字母ASCII编码A0x41B0x42C0x43D0x44……因为ASCII编码最多只能有128个字符,要想对更多的文字进......