H5上传照片调用相册拍照(附源码)

效果图:
在这里插入图片描述在这里插入图片描述
随便找了两张图片大家别介意哈~~~

话不多所上源码:

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<title>身份认证</title>
		<!--    
	  		@entry
		    @require vue
		    @require jquery
		    @require ./style/index.less
		    @require ../style/index.less
		    @seajs.use ./js/index.js
		    @seajs.use ./js/img-upload.js
  	-->
	</head>

	<body>
		<div id="speed"></div>
		<section class="pic-content">
			<div class="pic-group">
				<img src="../../img/sfz-just.png">
				<input type="file" accept="image/*" class="img-upload">
				<p>上传身份证人像面</p>
			</div>
			<div class="pic-group">
				<img src="../../img/sfz-back.png">
				<input type="file" accept="image/*" class="img-upload">
				<p>上传身份证国徽面</p>
			</div>
			<button class="but_boxr">人脸识别</button>
		</section>
	</body>
	<script>
        $(function(){
            $(".img-upload").change(function () {
                imgUpload.readURL(this);
            });
        })
    </script>
</html>

上面的引入方式是我公司自己封装的框架,大家可用正常的script引入js文件

img-upload.js

;(function(window){
    var imgUpload = {};

    /**
     * from https://my.oschina.net/zyxchuxin/blog/700381
     */
    imgUpload.readURL = function (input) {
        console.log("loading start")
        var _this = this;
        if (input.files && input.files[0]) {
            this.getOrientation(input.files[0], function(orientation) {
                var reader = new FileReader();
                var fileSize = Math.round(input.files[0].size / 1024 / 1024) ; //以M为单位(把字节转换为M)
                //input.files[0] 该信息包含:图片的大小,以byte计算 获取size的方法如下:input.files[0].size;
                reader.onload = function (e) {
                    //调用图片压缩方法:compress();
                    _this.compress(e.target.result,fileSize,input,orientation);
                };
                reader.readAsDataURL(input.files[0]);
            });
        }
    }

    /**
     * res代表上传的图片,fileSize大小图片的大小
     * from https://juejin.im/post/5baf4a04e51d450ea52fd9a4#heading-0
     */
    imgUpload.compress = function(res,fileSize,obj,orientation) { 
        var _this = this;
        var img = new Image(),
            maxW = 640; //设置最大宽度
        img.src = res;
        img.onload = function () {
            var canvas = document.createElement( 'canvas')
            var ctx = canvas.getContext( '2d');

            // 限制图片的宽度
            if(img.width > maxW) {
                img.height *= maxW / img.width;
                img.width = maxW;
            }

            switch (orientation) {
                case 3: // 旋转180°
                    canvas.width = img.width;
                    canvas.height = img.height;
                    ctx.rotate((180 * Math.PI) / 180);
                    ctx.drawImage(img, -img.width, -img.height, img.width, img.height);
                    break;
                case 6: // 旋转90°
                    canvas.width = img.height;
                    canvas.height = img.width;
                    ctx.rotate((90 * Math.PI) / 180);
                    ctx.drawImage(img, 0, -img.height, img.width, img.height);
                    break;
                case 8: // 旋转-90°
                    canvas.width = img.height;
                    canvas.height = img.width;
                    ctx.rotate((-90 * Math.PI) / 180);
                    ctx.drawImage(img, -img.width, 0, img.width, img.height);
                    break;
                default: //正常值
                    canvas.width = img.width;
                    canvas.height = img.height;
                    ctx.drawImage(img, 0, 0, img.width, img.height);
            }
            
            var compressRate = _this.getCompressRate(1,fileSize);
            var dataUrl = canvas.toDataURL( 'image/png', compressRate);

            // 优化图片铺满容器
            if(img.height / img.width < 0.5){
                obj.previousElementSibling.style.width = '100%';
            }else{
                obj.previousElementSibling.style.width = '2.6rem';
            }
            // 解决第二次选择相同文件不触发change事件
            obj.value = null;

            obj.previousElementSibling.setAttribute('src',dataUrl);
            console.log("dataUrl",dataUrl)
        }
    }

    /**
     * 计算压缩比率,size单位为MB
     */
    imgUpload.getCompressRate = function (allowMaxSize,fileSize){ 
          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;
    }

    /**
     * from http://stackoverflow.com/a/32490603
     * from https://github.com/majiang666/ImageFile/blob/master/src/index.js
     * 获取照片方向,主要是为了解决IOS和部分三星手机会出现此bug,照片方向的问题
     */ 
    imgUpload.getOrientation = function getOrientation(file, callback) {
        var reader = new FileReader();
        reader.onload = function(e) {
            var view = new DataView(e.target.result);
            if (view.getUint16(0, false) != 0xFFD8)
            {
                return callback(-2);
            }
            var length = view.byteLength, offset = 2;
            while (offset < length) 
            {
                if (view.getUint16(offset+2, false) <= 8) return callback(-1);
                var marker = view.getUint16(offset, false);
                offset += 2;
                if (marker == 0xFFE1) 
                {
                    if (view.getUint32(offset += 2, false) != 0x45786966) 
                    {
                        return callback(-1);
                    }
                    var little = view.getUint16(offset += 6, false) == 0x4949;
                    offset += view.getUint32(offset + 4, little);
                    var tags = view.getUint16(offset, little);
                    offset += 2;
                    for (var i = 0; i < tags; i++)
                    {
                        if (view.getUint16(offset + (i * 12), little) == 0x0112)
                        {
                            return callback(view.getUint16(offset + (i * 12) + 8, little));
                        }
                    }
                }
                else if ((marker & 0xFF00) != 0xFF00)
                {
                    break;
                }
                else
                { 
                    offset += view.getUint16(offset, false);
                }
            }
            return callback(-1);
        };
        reader.readAsArrayBuffer(file);
    }

    window.imgUpload = imgUpload;

})(window);

ps:还需要引入jquery哦!!

**遇android和ios的兼容坑请移步——帅哥美女请点这里~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刺心疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值