超清晰!HTML5 实现手机拍照上传功能原理讲解

这篇文章主要为大家详细介绍如何使用HTML5利用摄像头拍照实现上传功能,原理讲解非常清晰,具有较大的参考价值。

超清晰!HTML5 实现手机拍照上传功能原理讲解

上传页面代码:

<style >
    *{
        padding: 0;
        margin: 0;
    }
    .wrapper{
        width: 320px;
        height: 50px;
        margin: 20px auto;
        position: relative;
        border: 1px solid #f0f0f0;
    }
    input{
        width: 100px;
        height: 30px;
    }
    button{
        position: absolute;
        cursor: pointer;
        pointer-events: none;
        width: 100px;
        height: 30px;
        left: 0;
        top: 0;
    }
    a{
        pointer-events: none;
    }
    .img{
        border: 1px solid #ccc;
        padding: 10px;
    }
</style >
 
<div class = "wrapper">
     <input type = "file" accept= "image/*" capture= "camera" id= "img" />
     <button >上传照片 </button >
</div >

上传图片用的HTML5的file文件上传功能<input type=”file” accept=”image/*”>

因为原生file样式不满足要求,在input上面放置我们想要的页面效果。然后当点击上面的元素,就可以触发我们的input进行图片上传。此时的问题是:当点击input上面的元素,需要事件穿透,即相当于点击input。则借助于css3新属性pointer-events。

//使用cursor进行事件穿透,来阻止元素成为鼠标事件的目标
button{
     cursor:pointer;
     pointer-events:none;
}

图片压缩处理

  1. 因为是手机拍照上传,现在的手机拍的照片都很大,如果原图上传,太消耗用户流量,上传前要进行图片压缩。
  2.   通过change事件,监听图片上传,通过readerAsDataURL获取上传的图片。
document.getElementById( 'img').addEventListener( 'change', function () {
     var reader = new FileReader();
     reader.onload = function (e) {
          //调用图片压缩方法:compress();
     };
     reader.readAsDataURL(this.files[0]);
     console.log(this.files[0]);
     var fileSize = Math.round( this.files[0].size/1024/1024) ; //以M为单位
     //this.files[0] 该信息包含:图片的大小,以byte计算 获取size的方法如下:this.files[0].size;
}, false);

 对上传的图片进行压缩,需要借助于canvas API,调用其中的canvas.toDataURL(type, encoderOptions); 将图片按照一定的压缩比进行压缩,得到base64编码。重点来了:压缩策略:先设置图片的最大宽度 or 最大高度,一般设置其中一个就可以了,因为所有的手机宽高比差别不是很大。然后设置图片的最大size,allowMaxSize,根据图片的实际大小和最大允许大小,设置相应的压缩比率。

//最终实现思路:
1、设置压缩后的最大宽度 or 高度;
2、设置压缩比例,根据图片的不同size大小,设置不同的压缩比。
 
function compress(res,fileSize) { //res代表上传的图片,fileSize大小图片的大小
    var img = new Image(),
        maxW = 640; //设置最大宽度
 
    img.onload = function () {
        var cvs = document.createElement( 'canvas'),
            ctx = cvs.getContext( '2d');
 
        if(img.width > maxW) {
            img.height *= maxW / img.width;
            img.width = maxW;
        }
 
        cvs.width = img.width;
        cvs.height = img.height;
 
        ctx.clearRect(0, 0, cvs.width, cvs.height);
        ctx.drawImage(img, 0, 0, img.width, img.height);
 
        var compressRate = getCompressRate(1,fileSize);
 
        var dataUrl = cvs.toDataURL( 'image/jpeg', compressRate);
 
        document.body.appendChild(cvs);
        console.log(dataUrl);
    }
 
    img.src = res;
}
 
function getCompressRate(allowMaxSize,fileSize){ //计算压缩比率,size单位为MB
      var compressRate = 1;
 
      if(fileSize/allowMaxSize > 4){
           compressRate = 0.5;
      } else if(fileSize/allowMaxSize >3){
           compressRate = 0.6;
      } else if(fileSize/allowMaxSize >2){
           compressRate = 0.7;
      } else if(fileSize > allowMaxSize){
           compressRate = 0.8;
      } else{
           compressRate = 0.9;
      }
 
      return compressRate;
}

图片上传给服务器

图片已经压缩完成了,但是压缩后的图片不是File,而是一个base64编码,需要以String的形式将base64编码上传给服务器,服务器转存base64为img图片。

125jz网原创文章。发布者:江山如画,转载请注明出处:http://www.125jz.com/10947.html

(1)
江山如画的头像江山如画管理团队
赞!UI设计师必须学习的3个色彩理论
上一篇 2022年8月10日 下午9:14
精!HTML5调用手机拍照实现图片上传服务器,并将图片地址存进数据库(上)
下一篇 2022年8月11日 上午9:48

99%的人还看了以下文章

  • AdaGrad算法—随机梯度下降算法

    AdaGrad算法,它可以根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题。

    2023年10月9日
    5.1K0
  • NumPy快速入门(一)

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 NumPy作为高性能科学计算和数据分析的基础包,是其他重要数据分析工具的基础。 一、认识NumPy数组对象 import numpy as np #导入numpy数据包 data=np.arange(…

    2022年1月24日
    1.7K0
  • servlet共享变量实现计数器功能(servlet入门)

    servlet类中定义的成员变量,被所有的客户线程共享。 要求利用servlet共享变量实现计数器功能。 Count.java package com.servlet; import java.io.I.*; import javax.servlet.*; import javax.servlet.http.*; public class Count ext…

    2018年11月27日
    9.1K0
  • python 期末复习-综合练习题

    十八、分别使用for循环和while循环求1+2+3+4+……+856的和 要求: 1、新建一个“sum.py”文件。 2、编写程序。 3、调试程序。 4、排除错误。 十九、输入一个数,判断奇数偶数 要求: 1、新建一个“number.py”文件 2、编写程序。 3、调试程序。 4、排除错误。 二十、分别使用for循环和while循环输出1到100之间的偶数…

    2023年6月15日
    6.0K0
  • ADODB.Connection ���� ‘800a0e7a’ win7 IIS运行ASP常见问题及解决方法

    在win7系统通过 IIS运行ASP出现以下错误提示: ADODB.Connection 错误 ‘800a0e7a’ 很多人根据错误提示,去查数据库连接代码,其实数据库的连接代码没有错误。 出现ADODB.Connection 错误 ‘800a0e7a’的 原因 是64位Windows7操作系统中,IIS7应用程序池默认没有启用32位应用程序,而我们连接AC…

    2018年6月1日
    6.2K0
  • 第五章 JavaBean技术

    掌握:
    JavaBean的概念及规范
    JavaBean的创建与使用
    JavaBean属性的获取及修改
    getProperty:获取bean的属性值
    setProperty:设置bean的属性值

    2018年2月22日
    9.2K0

发表回复

登录后才能评论