利用canvas实现图片压缩的示例代码


Posted in HTML / CSS onJuly 17, 2018

项目中做身份证识别时,需要传送图片的 base64 格式编码,但是手机拍摄的照片都太大了,转成 base64 简直可怕,因此找了一下解决办法

涉及到的知识点

  • onchange 事件是在上传完文件之后触发
  • 使用 files 属性获取到上传的文件对象
  • readAsDataURL 用于转换成 base64 编码
  • 区分 canvas 的 画布 和 绘画环境:
    • 画布:对应代码中的 cvs,可以设置画布 width,height;
    • 绘画环境:对应代码中的 ctx ,可以设置 fillStyle,fillRect 等;
  • 使用 canvas 自带的 drawImage() 方法将图片画到 canvas 上
  • 想取到压缩后图片的 base64 可以使用 canvas 自带的 toDataURL() 方法

完整代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <input type="file" onchange="loadImg(this)">
    <hr>
    <div>800×449,544KB</div>
    <img src="" alt="">
    <hr>
    <div>400×224,157KB</div>
    <canvas></canvas>

    <script>
        //  上传图片
        function loadImg(me) {
            let img = document.querySelector('img');
            let cvs = document.querySelector('canvas');
            let file = me.files[0];    //  获取到文件对象
            //  上传的图片大于 500KB 时才压缩
            if (file && (file.size / 1024 > 500)) {
                let reader = new FileReader();
                reader.readAsDataURL(file);     //  转成 base64 编码
                reader.onload = function (e) {
                    let naturalBase64 = e.target.result;    //  获取 base64 编码,这是原图的
                    img.src = naturalBase64;
                    img.onload = function () {
                        let ratio = img.naturalWidth / img.naturalHeight; //  获取原图比例,为了等比压缩
                        cvs.width = 400;
                        cvs.height = cvs.width / ratio;
                        let ctx = cvs.getContext('2d');
                        ctx.drawImage(img, 0, 0, cvs.width, cvs.height);    //  画在 canvas 上
                        // 压缩后新图的 base64
                        let zipBase64 = cvs.toDataURL();
                    }
                }
            }
        }
    </script>
</body>

</html>

效果图

利用canvas实现图片压缩的示例代码

关于压缩后的图片大小

这里提供一个开箱即用的方法,baseStr 是一个 完整的 Base64 编码,就是包括

利用canvas实现图片压缩的示例代码

base64

代码:

function calcBase(baseStr){
    var tag = 'base64,';
    baseStr = baseStr.substring(baseStr.indexOf(tag)+tag.length);
    var eqTagIndex = baseStr.indexOf('=');
    baseStr = eqTagIndex!=-1?baseStr.substring(0,eqTagIndex):baseStr;
    var strLen = baseStr.length;
    var fileSize = strLen - (strLen / 8) * 2;
    console.log("文件大小:" + (fileSize / 1024).toFixed(1) + 'KB');
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3 网页下拉菜单代码解释 中文翻译
Feb 27 HTML / CSS
详解CSS3中Media Queries的相关使用
Jul 17 HTML / CSS
Html5实现单张、多张图片上传功能
Apr 28 HTML / CSS
HTML5的结构和语义(4):语义性的内联元素
Oct 17 HTML / CSS
input元素的url类型和email类型简介
Jul 11 HTML / CSS
HTML5页面音视频在微信和app下自动播放的实现方法
Oct 20 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
Aug 24 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
Mar 13 HTML / CSS
html5录音功能实战示例
Mar 25 HTML / CSS
html5默认气泡修改的代码详解
Mar 13 HTML / CSS
从QQtabBar看css命名规范BEM的详细介绍
Aug 07 HTML / CSS
使用CSS实现六边形的图片效果
Aug 05 HTML / CSS
canvas 如何绘制线段的实现方法
Jul 12 #HTML / CSS
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
Jul 12 #HTML / CSS
如何用canvas实现在线签名的示例代码
Jul 10 #HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
Jul 04 #HTML / CSS
快速实现一个简单的canvas迷宫游戏的示例
Jul 04 #HTML / CSS
HTML5中form如何关闭自动完成功能的方法
Jul 02 #HTML / CSS
Canvas实现保存图片到本地的示例代码
Jun 28 #HTML / CSS
You might like
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
python对url格式解析的方法
2015/05/13 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
python实现图片转字符小工具
2019/04/30 Python
使用python去除图片白色像素的实例
2019/12/12 Python
python3排序的实例方法
2020/10/20 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
南京某公司笔试题
2013/01/27 面试题
端午节活动策划方案
2014/03/09 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL
Android中View.post和Handler.post的关系
2022/06/05 Java/Android