html5使用canvas压缩图片的示例代码


Posted in HTML / CSS onSeptember 11, 2018

前俩天做了一个图片转base64上传的功能,发现如果图片的base64过大的话,请求会变的很慢,严重的直接超时了,所以想到了在上传前压缩一下图片,然后再上传到后台,这样可以大大的提高效率,在这里记录一下利用 canvas 压缩图片遇到的几个坑。完整代码会在文末给出。

第一个坑,在压缩图片的时候没获取图片本身的宽高,给了一个 600*480 的定宽定高,因为是手机端的,在上传图片的时候都是几兆的图片,所以这块没任何问题。出问题的地方在 修改头像的时候,测试的时候上传的图片都是小图片,然后就出现了 压缩后的图片显示不完全,大部分都是空白的现象,这就是因为在压缩的时候没有考虑图片原本的宽高的情况。

第二个坑,解决第一个坑的办法就是在图片加载完成后(onload),获取图片本身的宽高,然后赋值给 canvas ,这样进行操作,但是这有个坑就是,图片加载是异步的,在你 return 的时候,返回的可能是 undefined 而不是你需要的 压缩后的 base64。这里的解决方法是,新建一个 Promise ,然后把结果 resolve() 返回去,在调用的时候 .then() 得到结果。

知识点:

  • canvas 的 toDataURL('image/png', 0.9) ; 把 canvas 画的图片转换为 base64,第一个参数表示的是图片的类型,第二个参数表示的是图片的清晰度。
  • 规定一个最大尺寸,如果图片本身的宽高大于这个尺寸,按照最大的一个边进行缩放,另一个根据图片的 比例 进行设置,然后设置给 canvas .

miniImage.js

export default async function miniSize(imgData, maxSize = 200*1024){
    // const maxSize = 200 * 1024;

    if(imgData && imgData.files && imgData.files.size < maxSize) {
        return imgData.url;
    }else{
      console.log('----------------压缩图片-------------------');
      const canvas = document.createElement('canvas');
      let img = new Image();
      img.src = imgData.url;
      let ctx = canvas.getContext('2d');
      return new Promise((resolve =>{
        img.addEventListener('load', function(){
          //图片原始尺寸
          let originWidth = this.width;
          let originHeight = this.height;
          // 最大尺寸限制
          let maxWidth = 400, maxHeight = 400;
          // 目标尺寸
          let targetWidth = originWidth, targetHeight = originHeight;
          // 图片尺寸超过400x400的限制
          if (originWidth > maxWidth || originHeight > maxHeight) {
            if (originWidth / originHeight > maxWidth / maxHeight) {
              // 更宽,按照宽度限定尺寸
              targetWidth = maxWidth;
              targetHeight = Math.round(maxWidth * (originHeight / originWidth));
            } else {
              targetHeight = maxHeight;
              targetWidth = Math.round(maxHeight * (originWidth / originHeight));
            }
          }
          canvas.width = targetWidth;
          canvas.height = targetHeight;
          ctx.drawImage(img, 0, 0, targetWidth, targetHeight);
          let base64 = canvas.toDataURL('image/png', 0.9);
          resolve(base64);
        }, false);
      }))
    }
}

调用:

test.js

onChangeImg = async (files, type, index) => {
    let previous = this.props.imagePicker.files;
    if(type === "add") {
      let result = miniSize(files[files.length-1]);
      //使用 .then() 调用获得结果
      await result.then(res => {
         previous.push({url: res});
      });
    }else if(type === "remove") {
        previous.splice(index,1);
    }
    await this.props.dispatch({
      type: 'imagePicker/saveImage',
      payload: {
        files: previous
      }
    })
  }

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

HTML / CSS 相关文章推荐
如何利用CSS3制作3D效果文字具体实现样式
May 02 HTML / CSS
css3 自定义字体font-face使用介绍
May 14 HTML / CSS
可自定义箭头样式的CSS3气泡提示框
Mar 16 HTML / CSS
CSS3近阶段篇之酷炫的3D旋转透视
Apr 28 HTML / CSS
详解background属性的8个属性值(面试题)
Nov 02 HTML / CSS
CSS3 实现飘动的云朵动画
Dec 01 HTML / CSS
html5 canvas 使用示例
Oct 22 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
May 04 HTML / CSS
使用HTML5的Notification API制作web通知的教程
May 08 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
Jan 20 HTML / CSS
HTML5 表单验证失败的提示语问题
Jul 13 HTML / CSS
基于HTML5的WebGL经典3D虚拟机房漫游动画
Nov 15 HTML / CSS
canvas像素点操作之视频绿幕抠图
Sep 11 #HTML / CSS
HTML5中使用json对象的实例代码
Sep 10 #HTML / CSS
html5 figure和figcaption的使用方法
Sep 10 #HTML / CSS
用canvas画心电图的示例代码
Sep 10 #HTML / CSS
Html5 canvas实现粒子时钟的示例代码
Sep 06 #HTML / CSS
canvas离屏技术与放大镜实现代码示例
Aug 31 #HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
Aug 29 #HTML / CSS
You might like
php伪静态之APACHE篇
2014/06/02 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
Tornado高并发处理方法实例代码
2018/01/15 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
python如何爬取网页中的文字
2020/07/28 Python
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
《海伦?凯勒》教学反思
2014/04/17 职场文书
投资建议书模板
2014/05/12 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书