超清晰!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%的人还看了以下文章

  • JS+CSS3制作图形验证码

    一个前端验证的验证码,利用JS和CSS3实现。

    2022年12月1日
    11.4K0
  • 推荐!Django 新手入门图文教程

    推荐!Django 新手入门图文教程推荐!Django 新手入门图文教程推荐!Django 新手入门图文教程推荐!Django 新手入门图文教程

    一、Django简介 百度百科:一个开放源代码的Web框架,由Python语言编写…… 重点:一个大而全的框架,啥都替你考虑好了。 1. web框架介绍 具体介绍Django之前,必须先介绍Web框架的概念。 Web框架: 别人已经设定好的一个Web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子。 一般Web框架的…

    2023年1月24日 编程开发
    6.1K0
  • python使用列表生成式生成列表 其元素为100以内所有能被3整除的数

    python : 不使用列表生成式,生成元素为100以内所有能被3整除的数,代码如下: m=[] for i in range(3,100): if (i%3==0): m.append(i) print(m) 使用列表生成式生成列表,其元素为100以内所有能被3整除的数,代码: n=[i for i in range(3,100) if(i%3==0)] …

    2020年1月2日
    135.4K0
  • opencv 图像旋转 cv2.rotate和np.rot90案例精讲

    OpenCV 方法 OpenCV 中带有一个旋转图像的函数 cv2.rotate rotate(src, rotateCode[, dst]) -> dst参数:src:输入图像rotateCode:旋转方式1、cv2.ROTATE_90_CLOCKWISE:顺时针 90 度2、cv2.ROTATE_180:顺时针 180 度3、cv2.ROTATE_…

    2022年12月1日
    10.7K0
  • 1.Spring框架概述

    1.Spring框架概述1.Spring框架概述1.Spring框架概述1.Spring框架概述

    1.1、资源 1.2、Spring历史 1.3、框架特征与功能 1.4、Spring组成 1.5、Spring Boot与Spring Cloud 一、Spring框架概述 Spring是一个开源免费的框架,为了解决企业应用开发的复杂性而创建。Spring框架是一个轻量级的解决方案,可以一站式地构建企业级应用。Spring是模块化的,所以可以只使用其中需要的…

    2023年1月19日 编程开发
    8.2K0
  • 第3课:C语言程序的构成和书写规则

    先来看一个C语言程序:输入两个正整数,计算并输出两数的和。 程序代码: /*ex1_2.c:求两个正整数的和*/ #include <stdio.h> void main()                         /*主函数*/ {     int a,b,sum;                    /*定义三个整型变量*/    …

    2020年4月5日
    12.2K0

发表回复

登录后才能评论