在做一些活动页的时候,经常会有一些需要上传图片的需求,并且还需要将图片以及生成的文字以及贴图生成一张卡可以供用户可以长按保存。这个需求之前完成过一次,最近又遇上了,使用的都是canvas来实现的。干脆整理出一篇博客出来。如果有更好的实现方法,欢迎提出一起探讨。
使用canvas压缩图片
在html中使用写入input标签,type为file时候,可以调出手机的相册可供选择照片,也可以支持摄像头进行拍照功能。在这个场景下,就可能出现图片的体积会更大,可能会超出后端所支持的最大范围,从而导致上传失败。
<input id="file" type="file">
1.首先要先获取到图片文件
var elefile = document.querylector('#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应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容
方法:
filereader处理事件简介
继续上面的操作,在拿到图片之后,需要将文件进行处理转化,此时
var reader = new filereader(); //将文件以data url形式读入页面 reader.readasdataurl(file); reader.onload=function(e) { console.log(reader) }
现在取到了图片也进行了转化,现在可以进行压缩了。
var elefile = document.querylector('#file'); var reader = new filereader() elefile.addeventlistener('change', function (event) { file = event.target.files[0]; // console.log(file) // 选择的文件是图片 i平凡的世界主题曲f (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.tattribute("src", this.result) canvasdataurl(this.result, 100, 0.5) } } }) /* [canvasdataurl 通过canvas进行压缩] * @params path 图片的ba64的格式 * @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.tattributenode(anw); canvas.tattributenode(anh); ctx.drawimage(this, 0, 0, w, h); // quality值越小,所绘制出的图像越模糊 var ba64 = canvas.todataurl('image/jpeg', quality); var result=document.getelementbyid("result"); result.tattribute("src", ba64) } }
很简单,这样就可以得到压缩后的图片了,从以上的代码可得知,原理在于canvas中的todataurl方法可指定图片压缩后的格式及压缩质量,把canvas信息压缩并转为ba64编码来实现压缩。
使用canvas制作卡片
场景:把刚刚压缩之后的图片与另一张图片相结合,可长按进行保存。
function drawcanvas (target) { var canvas = document.querylector('#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 spo2是什么意思/ 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.todatau塑身内衣品牌rl('image/png', 1) resultimg.style.width = '100%' var cardimg=document.getelementbyid("cardimg"); cardimg.tattribute("src", resultimg.src) } }
取到刚刚得到的图片,在图像装载完毕时后将其画到画布上,也可以配上文字等等,最后也是把canvas的信息转为ba64编码来进行实现 。可以通过代码来进行实例的实践
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-03 03:54:35,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/147b25553b4ae6dace55611c9041e0bf.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:canvas压缩图片以及卡片制作的方法示例.doc
本文 PDF 下载地址:canvas压缩图片以及卡片制作的方法示例.pdf
留言与评论(共有 0 条评论) |