设为首页 收藏本站
查看: 682|回复: 0

小猿圈入门html5教程之利用canvas实现图片压缩方法

[复制链接]
累计签到:3 天
连续签到:3 天
发表于 2019-5-23 17:50:58 | 显示全部楼层 |阅读模式
现在学习前端你的小伙伴都在迷茫遇到问题,找不到老师怎么办?这些也是小猿圈web前端老师担心的,以后每天小猿圈都会为大家分享一些关于学习前端中的一些小问题,今天分享的是利用canvas实现图片压缩方法。



项目中做身份证识别时,需要传送图片的base64格式编码,但是手机拍摄的照片都太大了,转成base64简直可怕,因此找了一下解决办法。
涉及到的知识点
onchange事件是在上传完文件之后触发
使用files属性获取到上传的文件对象
readAsDataURL用于转换成base64编码
区分canvas的画布和绘画环境:
画布:对应代码中的cvs,可以设置画布width,height;
绘画环境:对应代码中的ctx,可以设置fillStyle,fillRect等;
使用canvas自带的drawImage()方法将图片画到canvas上
想取到压缩后图片的base64可以使用canvas自带的toDataURL()方法
完整代码
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width,initial-scale=1.0">
<metahttp-equiv="X-UA-Compatible"content="ie=edge">
<title>Document</title>
</head>
<body>
<inputtype="file"onchange="loadImg(this)">
<hr>
<div>800×449,544KB</div>
<imgsrc=""alt="">
<hr>
<div>400×224,157KB</div>
<canvas></canvas>
<script>
//上传图片
functionloadImg(me){
letimg=document.querySelector('img');
letcvs=document.querySelector('canvas');
letfile=me.files[0];//获取到文件对象
//上传的图片大于500KB时才压缩
if(file&&(file.size/1024>500)){
letreader=newFileReader();
reader.readAsDataURL(file);//转成base64编码
reader.onload=function(e){
letnaturalBase64=e.target.result;//获取base64编码,这是原图的
img.src=naturalBase64;
img.onload=function(){
letratio=img.naturalWidth/img.naturalHeight;//获取原图比例,为了等比压缩
cvs.width=400;
cvs.height=cvs.width/ratio;
letctx=cvs.getContext('2d');
ctx.drawImage(img,0,0,cvs.width,cvs.height);//画在canvas上
//压缩后新图的base64
letzipBase64=cvs.toDataURL();
}
}
}
}
</script>
</body>
</html>
关于压缩后的图片大小
这里提供一个开箱即用的方法,baseStr是一个完整的Base64编码
代码:
functioncalcBase(baseStr){
vartag='base64,';
baseStr=baseStr.substring(baseStr.indexOf(tag)+tag.length);
vareqTagIndex=baseStr.indexOf('=');
baseStr=eqTagIndex!=-1?baseStr.substring(0,eqTagIndex):baseStr;
varstrLen=baseStr.length;
varfileSize=strLen-(strLen/8)*2;
console.log("文件大小:"+(fileSize/1024).toFixed(1)+'KB');
}
今天的知识点就分享到这里了,有需要的朋友欢迎点赞评论转发,想了解更多web前端开发内容的朋友可以关注小猿圈的每天的动态web前端自学②群:738735873,会不定时更新很多更好的内容奉献给大家,希望对你的学习有所帮助。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-849390-1-1.html 上篇帖子: 小猿圈Python教程之全面解析@property的使用 下篇帖子: 小猿圈html5教程之canvas绘制线段方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表