【前端】利用canvas实现图片压缩(附demo源码)

简言

记录下使用canvas来压缩图片的实现方式。

图片压缩

有的时候会遇到图片压缩的场景,我们可以使用canvas重新绘制图片,然后利用canvas的toDataURL()API导出base64数据实现图片压缩。
canvas图片压缩原理:

  • canvas重新绘制图片可以控制绘制图片的大小,进而改变绘制图片的像素数据。
  • canvas的toDataURL()API可以控制导出图片质量,改变图片的大小。

实现

我个人实现了一个简单的demo,你可以根据需要自行修改。
demo实现步骤:

  1. 获取图片
  2. 创建canvas和img元素,然后将img元素绘制到canvas上
  3. 使用canvas导出图片
  4. 提供下载

获取图片

获取图片主要是获取图片的地址。
我是用input元素获取图片,这样可以本地上传图片。
然后监听input的change事件获得文件对象(图片)。

 <input type="file" accept="image/*" id="file">

绘制图片

使用canvas上下文的drawImage()方法绘制,方便控制大小。
具体参考:MDN的drawImage

const img = new Image()img.src = fileBlobimg.onload = function (e) {console.log(img, img.width, 'img');const canvas = document.createElement('canvas')canvas.width = img.widthcanvas.height = img.heightconst ctx = canvas.getContext('2d')ctx.drawImage(img, 0, 0, canvas.width, canvas.height)}

导出图片

利用canvas的toDataURL()API导出图片,它有两个参数:

  • 参数1:导出类型
  • 参数2:图片质量(0-1)1质量最高,0最差。

具体参考:MDN的toDataURL

          data = canvas.toDataURL(imgType, 0.5)

图片下载

利用a链接下载。(适合大部分浏览器,兼容性自行实现)

  download.onclick = function () {console.log(data, 'data');const a = document.createElement('a')a.href = dataa.download = imgNamea.type = imgTypea.click()}

源码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>图片压缩</title>
</head><body><div><input type="file" accept="image/*" id="file"><div><div><span>压缩前:</span><span id="before-size"></span></div><div><span>压缩后:</span><span id="after-size"></span></div></div><div><button id="download">下载</button></div></div><script>const file = document.getElementById('file')const download = document.getElementById('download')const beforeSize = document.getElementById('before-size')const afterSize = document.getElementById('after-size')let data = null // 压缩后的图片let imgName = ''let imgType = ''file.onchange = function (e) {console.log(e.target.files);const files = e.target.filesfor (let i = 0; i < files.length; i++) {const file = files[i]console.log(file, 'file');imgName = file.nameimgType = file.typebeforeSize.innerHTML = file.size / 1024 + 'KB'const fileBlob = URL.createObjectURL(file)const img = new Image()img.src = fileBlobimg.onload = function (e) {console.log(img, img.width, 'img');const canvas = document.createElement('canvas')canvas.width = img.widthcanvas.height = img.heightconst ctx = canvas.getContext('2d')ctx.drawImage(img, 0, 0, canvas.width, canvas.height)data = canvas.toDataURL(imgType, 0.5)console.log(getBase64Size(data, imgType), 'data.size');afterSize.innerHTML = getBase64Size(data, imgType) + 'KB'}}}download.onclick = function () {console.log(data, 'data');const a = document.createElement('a')a.href = dataa.download = imgNamea.type = imgTypea.click()}//	获取base64数据的大小,单位kbfunction getBase64Size(base64, type) {if (!base64) {return 0}if (base64.indexOf(';base64,') === -1) {return 0}base64 = base64.replace('data:' + type + ';base64,', '')if (base64.length % 4 === 0) {base64 = base64.replace(/=+$/, '')}return (base64.length - base64.length / 8 * 2) / 1024}</script>
</body></html>

示例图

在这里插入图片描述
在这里插入图片描述

结语

结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707135.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL创建存储过程函数(2)

DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL,userName varchar(20) DEFAULT NULL,pwd varchar(36) DEFAULT NULL,phone varchar(11) DEFAULT NULL,age tinyint(3) DEFAULT NULL,sex char(2) DEFAULT NULL,i…

Java | Leetcode Java题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode partition(ListNode head, int x) {ListNode small new ListNode(0);ListNode smallHead small;ListNode large new ListNode(0);ListNode largeHead large;while (head ! null) {if (head.val < x…

mysql8.0(安装含踩坑内容)

下载 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz 上传 文件包移动到/usr/local/ cp mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz /usr/local/ 解压 tar xvJf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz 重命名 mv …

收放卷伺服控制系统详细算法介绍(电子齿轮+张力PID卷绕轴控制功能块)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下 1、收放卷+排线控制 收放卷+排线控制系统框图-CSDN博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代…

第二证券资讯|昨夜,黄金大涨、美股创新高!人民币狂拉

受降息预期影响&#xff0c;美股三大指数团体创新高&#xff0c;黄金期现价格亦大幅走高。 当地时间5月15日星期三&#xff0c;美股三大股指全线收涨。道指涨0.88%&#xff0c;纳指涨1.40%&#xff0c;标普500指数涨1.17%。 经济数据方面。美国4月CPI同比上涨3.4%&#xff0c…

运动耳机怎么选?五款新手必买的运动耳机盘点

运动耳机是专为运动爱好者设计的耳机&#xff0c;轻巧便携&#xff0c;佩戴稳固。无论你在跑步、健身还是骑行&#xff0c;它都能为你带来优质的音乐体验。那如何选择一款合适的运动耳机呢&#xff1f;这里&#xff0c;我结合自己和身边朋友平时选购经验&#xff0c;整理了一些…

纵横交织的功能的单元测试

在编写纵横交织的功能的单元测试时&#xff0c;你需要确保你的测试覆盖了各种情况和交互。这通常包括测试各个功能模块的单元&#xff0c;以及确保它们与其他模块的交互正常。而且在我们实际操作中会遇到这种各样的问题&#xff0c;下面的解决方法可得好好看看。 1、问题背景 …

Linux系统下qtcreator每次打开文件都要重新编码问题

在Linux系统下qtcreator每次打开windows系统下的.c文件都会提示编码问题&#xff0c; 提示错误&#xff1a;“Could not decode “xxx” with “UTF-8”-encoding. Editing not possible "中文显示乱码&#xff0c;不能编译&#xff0c;如下图&#xff1a; 解决&#xff…

Phidata:快速构建一个智能 AI 助手【附代码示例】

介绍 Phidata Phidata 是一个尖端的框架&#xff0c;专为开发具有超越传统语言模型能力的自治助手&#xff08;或称为代理&#xff09;而设计。这些 AI 助手拥有长期记忆、深入的情境理解能力以及通过函数调用执行操作的能力&#xff0c;使它们在各种应用中非常有效。项目近期…

Ansys Mechanical|中远程点的Behavior该如何设置?

Remote point是ANSYS mechanical中的一种常见节点自由度耦合建模形式&#xff0c;在转动装配体中的连接转动副、或者在施加远端约束及远端载荷的时候&#xff0c;我们经常用到远端单元来耦合一个面或者一条线。例如销轴似的滚动摩擦连接&#xff0c;如果我们希望将两个物体通过…

python 六句话让电脑告诉你,刚才插入的串口编号

六句话让电脑告诉你&#xff0c;我的串口号 第一步&#xff0c;安装python 编译器以及pyserial 模块第二步&#xff0c;写入代码 import serial.tools.list_ports usart_list list(serial.tools.list_ports.comports()) input("Please insert your serial port:")…

中国人民大学金融硕士为什么在年复一年中持续不断升温?原来是因为这些

中国人民大学作为中国顶尖的高等学府之一&#xff0c;对于金融行业这个及其看中出身的行业&#xff0c;选择985、211院校读金融硕士那一定是最优选择&#xff0c;但难度也是可想而知的。好在中国人民大学现在针对金融硕士的就读方式有很多&#xff0c;如果本校硕士有难度&#…