canvas压缩图片以及卡片制作的方法示例


Posted in HTML / CSS onDecember 04, 2018

在做一些活动页的时候,经常会有一些需要上传图片的需求,并且还需要将图片以及生成的文字以及贴图生成一张卡可以供用户可以长按保存。这个需求之前完成过一次,最近又遇上了,使用的都是canvas来实现的。干脆整理出一篇博客出来。如果有更好的实现方法,欢迎提出一起探讨。

使用canvas压缩图片

在html中使用写入input标签,type为file时候,可以调出手机的相册可供选择照片,也可以支持摄像头进行拍照功能。在这个场景下,就可能出现图片的体积会更大,可能会超出后端所支持的最大范围,从而导致上传失败。

<input id="file" type="file">

1.首先要先获取到图片文件

var eleFile = document.querySelector('#file');
  var reader = new FileReader()
  eleFile.addEventListener('change', function (event) {
    file = event.target.files[0];
    console.log(file)
    // 选择的文件是图片
    if (file.type.indexOf("image") == 0) {
      reader.readAsDataURL(file);    
    }
  });

2.这个时候就取到了图片文件,就不得不了解一下js中FileReader对象的使用了

FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容

方法:

方法名 参数 描述
abort none 中断读取
readAsBinaryString file 二进制码
readAsDataURL file 将文件读取为 DataURL
readAsText file, [encoding] 将文件读取为文本
  • readAsText:该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。
  • readAsBinaryString:该方法将文件读取为二进制字符串,通常我们将它传送到后端,后端可以通过这段字符串存储文件。
  • readAsDataURL:这是例子程序中用到的方法,该方法将文件读取为一段以 data: 开头的字符串,这段字符串的实质就是 Data URL,Data URL是一种将小文件直接嵌入文档的方案。这里的小文件通常是指图像与 html 等格式的文件。(其中base64的方式就是由此来获得的。。)

FileReader处理事件简介

事件 描述
onabort 中断时触发
onerror onabort
onload 文件读取成功完成时触发
onloadend 读取完成触发,无论成功或失败
onloadstart 读取开始时触发
onprogress 读取中

继续上面的操作,在拿到图片之后,需要将文件进行处理转化,此时

var reader = new FileReader(); 
//将文件以Data URL形式读入页面 
  reader.readAsDataURL(file); 
  reader.onload=function(e) { 
    console.log(reader)
  }

现在取到了图片也进行了转化,现在可以进行压缩了。

var eleFile = document.querySelector('#file');
  var reader = new FileReader()
  eleFile.addEventListener('change', function (event) {
    file = event.target.files[0];
    // console.log(file)
    // 选择的文件是图片
    if (file.type.indexOf("image") == 0) {
      var reader = new FileReader(); 
      //将文件以Data URL形式读入页面 
        reader.readAsDataURL(file); 
        reader.onload=function(e) { 
          // console.log(this.result)
          var pre=document.getElementById("pre"); 
          pre.setAttribute("src", this.result)
          canvasDataURL(this.result, 100, 0.5)
        }     
    }
  })
  /* [canvasDataURL    通过canvas进行压缩]
   * @params path  图片的base64的格式
   * @params targetWidth  压缩后图片的宽度  
   * @params quality 图片质量  quality值越小,所绘制出的图像越模糊
   */
  function canvasDataURL(path, targetWidth, quality) {
    var img = new Image();
    img.src = path
    img.onload = function () {
        // var that = this
        // console.log(that)
        // 默认按比例压缩
        var w = this.width
        var h = this.height
        scale = w / h;
        w = targetWidth
        h = targetWidth / scale
        var quality = quality;  // 默认图片质量为0.7
        //生成canvas
        var canvas = document.createElement('canvas');
        var ctx = canvas.getContext('2d');
        // 创建属性节点
        var anw = document.createAttribute("width");
        anw.nodeValue = w;
        var anh = document.createAttribute("height");
        anh.nodeValue = h;
        canvas.setAttributeNode(anw);
        canvas.setAttributeNode(anh);
        ctx.drawImage(this, 0, 0, w, h);
        // quality值越小,所绘制出的图像越模糊
        var base64 = canvas.toDataURL('image/jpeg', quality);
        var result=document.getElementById("result"); 
        result.setAttribute("src", base64)
    }
  }

很简单,这样就可以得到压缩后的图片了,从以上的代码可得知,原理在于canvas中的toDataURL方法可指定图片压缩后的格式及压缩质量,把canvas信息压缩并转为base64编码来实现压缩。

使用canvas制作卡片

场景:把刚刚压缩之后的图片与另一张图片相结合,可长按进行保存。

function drawCanvas (target) {
    var canvas = document.querySelector('#myCanvas')
    var ctx = canvas.getContext('2d')
    // 是设备上物理像素和设备独立像素(device-independent pixels (dips))的比例
    var dp = window.devicePixelRatio || 1
    var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1
    var ratio = this.dp / this.backingStoreRatio
    var oldWidth = canvas.width
    var oldHeight = canvas.height
    canvas.width = oldWidth * ratio
    canvas.height = oldHeight * ratio
    canvas.style.width = oldWidth + 'px'
    canvas.style.height = oldHeight + 'px'
    ctx.scale(ratio, ratio)
    var headerImg = new Image()
    var bgImg = new Image()
    headerImg.src = target
    bgImg.src = '../bg.png'
    headerImg.onload = (e) => {
      // 图片的宽高比
      var rate = headerImg.width / headerImg.height
      console.log(rate)
      bgImg.onload = (e) => {
        ctx.drawImage(headerImg, 10, 30, 50, (50 / rate))
        // 背景图片
        ctx.drawImage(bgImg, 0, 0, 150, 150)
        ctx.fillText('厉害啊', 80, 70)
        var resultImg = new Image()
        resultImg.src = canvas.toDataURL('image/png', 1)
        resultImg.style.width = '100%'
        var cardImg=document.getElementById("cardImg"); 
        cardImg.setAttribute("src", resultImg.src)
      }
    }

取到刚刚得到的图片,在图像装载完毕时后将其画到画布上,也可以配上文字等等,最后也是把canvas的信息转为base64编码来进行实现 。可以通过代码来进行实例的实践

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

HTML / CSS 相关文章推荐
利用css3实现的简单的鼠标悬停按钮
Nov 04 HTML / CSS
一款纯css3实现的漂亮的404页面的实例教程
Nov 27 HTML / CSS
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
Jan 17 HTML / CSS
Html5之svg可缩放矢量图形_动力节点Java学院整理
Jul 17 HTML / CSS
HTML5 Canvas图像模糊完美解决办法
Feb 06 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
Jan 14 HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
Oct 26 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
Apr 16 HTML / CSS
前后端结合实现amazeUI分页效果
Aug 21 HTML / CSS
HTML速写之Emmet语法规则的实现
Apr 07 HTML / CSS
浅谈由position属性引申的css进阶讨论
May 25 HTML / CSS
CSS font-variation 可变字体的魅力(实例详解)
Mar 03 HTML / CSS
canvas探照灯效果的示例代码
Nov 30 #HTML / CSS
localStorage的过期时间设置的方法详解
Nov 26 #HTML / CSS
canvas拼图功能实现代码示例
Nov 21 #HTML / CSS
详解Canvas 跨域脱坑实践
Nov 07 #HTML / CSS
浅谈移动端网页图片预加载方案
Nov 05 #HTML / CSS
Canvas中设置width与height的问题浅析
Nov 01 #HTML / CSS
html5 postMessage前端跨域并前端监听的方法示例
Nov 01 #HTML / CSS
You might like
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
swfupload 多文件上传实现代码
2008/08/27 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
js实现简单进度条效果
2020/03/25 Javascript
windows下安装python paramiko模块的代码
2013/02/10 Python
使用python实现接口的方法
2017/07/07 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
合同专员岗位职责
2013/12/18 职场文书
四年级下册教学反思
2014/02/01 职场文书
银行转正自我鉴定
2014/09/29 职场文书
党支部审查意见
2015/06/02 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
思想品德课教学反思
2016/02/24 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
canvas绘制折线路径动画实现
2021/05/12 Javascript
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技