前端借助Canvas实现压缩base64图片两种方法

news2025/7/29 0:39:10

一、具体代码

1、利用canvas压缩图片方法一

  // 第一种压缩图片方法(图片base64,图片类型,压缩比例,回调函数)
  // 图片类型是指 image/png、image/jpeg、image/webp(仅Chrome支持)
  // 该方法对以上三种图片类型都适用 压缩结果的图片base64与原类型相同
  // 压缩结果存在误差 压缩比例只能作为范围参考
  function compressImg(base64, type, rate, callback) {
    // 声明一个Image对象
    var _img = new Image();
    // 将图片的地址赋予这个Image
    _img.src = base64;
    // 在图片加载完成后
    _img.onload = function () {
      // 创建canvas标签
      var _canvas = document.createElement("canvas");
      // 根据压缩比例设置canvas画布的宽高属性
      // this 指的是当前Image对象
      var w = this.width * rate;
      var h = this.height * rate;
      _canvas.setAttribute("width", w);
      _canvas.setAttribute("height", h);
      // 将图片渲染到canvas画布上 并设置渲染图片的宽高与画布的宽高一致
      _canvas.getContext("2d").drawImage(this, 0, 0, w, h);
      // 将canvas画布转换成对应类型的base64 
      var base64 = _canvas.toDataURL(type);
      // 将结果通过回调函数传递给方法的调用者
      callback(base64);
    };
  }

2、利用canvas压缩图片方法二

  // 第二种压缩图片的方法(图片base64,图片类型,压缩比例,回调函数)
  // 该方法只能将图片压缩为为image/jpeg和image/webp两种类型的图片base64
  // 压缩结果存在一定误差  但比第一种方法更加准确
  function compressImg2(base64, rate, callback) {
    // 声明一个Image对象
    var _img = new Image();
    // 将图片的地址赋予这个Image
    _img.src = base64;
    // 在图片加载完成后
    _img.onload = function () {
      // 创建canvas标签
      var _canvas = document.createElement("canvas");
      // 设置canvas画布的宽高属性
      // this 指的是当前Image对象
      var w = this.width;
      var h = this.height;
      _canvas.setAttribute("width", w);
      _canvas.setAttribute("height", h);
      // 将图片渲染到canvas画布上 并设置渲染图片的宽高与画布的宽高一致
      _canvas.getContext("2d").drawImage(this, 0, 0, w, h);
      // 将canvas画布转换成base64 但第一个参数 转换后的图片类型只能为image/jpeg或image/webp
      // 根据压缩比例设置第二个参数图片质量(范围0-1)
      var base64 = _canvas.toDataURL('image/jpeg',rate);
      // 将结果通过回调函数传递给方法的调用者
      callback(base64);
    };
  }

3、调用压缩方法

// 图片base64
const base64 = 'data:image/****;base64,*****'
console.log('压缩前的图片---',base64);
// 获取图片的类型
const type =file.type

// 调用压缩方法一
compressImg(res.data,type,0.6,(res2) => {
	console.log('这是第一种方法压缩0.6倍后的图片:---',res2)
})
// 调用压缩方法二
compressImg2(res.data,0.6,(res3) => {
	console.log('这是第二种方法压缩0.6倍后的图片:---',res3)
})

4、代码解析

​ 这两种压缩图片的方法,是借助于Imagecanvas实现的,整体区别不大,前半部分都是先将base64图片通过src渲染到一个Image中,当图片加载完成,触发onload事件后,创建一个canvas元素。区别主要是后半部分:

​ 第一种方法是在创建canvas元素后,设置其宽高为图片原来宽高*压缩比例,然后将图片渲染到canvas元素上,同时设置渲染图片的宽高与canvas宽高一致,最后通过toDataURL(type)canvas画布转成base64,参数type设置为原来的图片类型。其主要原理是通过压缩宽高来实现压缩图片的大小,但压缩结果误差较大。

​ 第二种方法是在创建canvas元素后,设置其宽高与图片原本宽高一致,并将图片渲染到canvas元素上,同时设置渲染图片的宽高与canvas宽高一致,但是在通过toDataURL()canvas画布转成base64时,第一个参数设置图片类型为:image/jpegimage/webp,第二个参数设置图片的质量,范围是0-1。其主要原理是改变图片的质量来实现压缩图片的大小,压缩结果相对准确一些。

5、HTMLCanvasElement.toDataURL([type,encoderOptions])

​ 该方法是canvas元素实例的一个方法,参数有两个,都是可选参数:type - 输出图片的类型,默认为image/png类型,常见的类型有:image/png、image/jpeg、image/webp(仅Chrome支持),图片的分辨率为 96dpi; encoderOptions - 当第一个参数指定图片类型为 image/jpegimage/webp 的情况下,可以通过该参数设置输出图片的质量,取值区间是0-1,默认为0.92,当超出取值区间时,会使用默认值。

​ 该方法的返回值是一个包含图片信息的Data URL,也可以看成图片的base64字符串。但如果调用该方法的canvas元素的宽或高为0,则返回值为字符串"data:,",、

浏览器兼容性:

在这里插入图片描述

6、相关文档:

前端FileReader对象实现图片file文件转base64

前端将base64图片转换成file文件

toDataURL

Data URL

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

02--微信小程序开发流程

开发小程序一般流程:申请小程序帐号安装小程序开发者工具开发小程序提交审核和发布1、注册小程序帐号在微信公众平台官网首页(mp.weixin.qq.com)点击右上角的“立即注册”按钮。2、填写帐号信息 主体为企业时需要一些信息包括:企业…

狂神说:面向对象(一) —— OOP与方法回顾

OOP详解以类的方式组织代码,以对象的方式组织(封装)数据什么是面向对象封装 【口袋装数据,留个口,可以用】继承 【儿子和父亲】多态 【同一个事物表现出多种形态】对象和类实际:先有对象后有类代码&#xf…

商城进货记录交易-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-2】商城进货记录交易 【任务介绍】 1.任务描述 每个商城都需要进货,而这些进货记录整理起来很不方便,本案例要求编写一个商城进货记录交易的程序,使用字节流将商场的进货信息记录在本地的csv文件中。程序具体要求如下: …

网络编程NIO

Java NIO(New IO 或 Non Blocking IO)是从Java 1.4 版本开始引入的一个新的IO API,可以替代标准的 Java IO API。NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式进行文件的读写操作。 非阻塞 IO(NIO) 通过Selector去实…

ASP.NET Core MVC 项目 IOC容器

目录 一:什么是IOC容器 二:简单理解内置Ioc容器 三:依赖注入内置Ioc容器 四:生命周期 五:多种注册方式 一:什么是IOC容器 IOC容器是Inversion Of Control的缩写,翻译的意思就是控制反转。 …

【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (2)-触发器 前言 上文中提到触发器的类型有以下4种,其中第一种【计划】是常用的, 与其他工具/服务类似的方式&#…

游戏、广告作底盘,价值直播为引擎,搜狐活在当下

2022年,中国互联网行业迎来了集体性的“中年危机”。 流量见顶、红利耗尽,再加上疫情的影响,国内互联网企业在过去一年真真实实地感受到了寒气。根据工信部数据,2022年,中国规模以上互联网和相关服务企业总收入达1.46…

【异构图笔记,篇章1】RGCN:Modeling Relational Data with Graph Convolutional Networks

【异构图笔记,篇章1】RGCN:Modeling Relational Data with Graph Convolutional Networks论文信息论文要点快览论文内容介绍背景任务RGCN Conv的介绍RGCN的trick论文实验结果实体分类链路预测评价及总结本文仅供学习,未经同意请勿转载 后期会陆续公开关于…

顺序表的增删查改

数据结构 是数据存储的方式,对于不同的数据我们要采用不同的数据结构。就像交通运输,选用什么交通工具取决于你要运输的是人还是货物,以及它们的数量。 顺序存储结构 包括顺序表、链表、栈和队列等。 例如腾讯QQ中的好友列表,…

运动蓝牙耳机什么款式最好、公认最好用的运动耳机推荐

如今大家对于运动越来越热衷,健身意识的逐渐加强,也带动了对运动装备的需求,其中运动蓝牙耳机也成为运动达人不可缺少的一部分了,在运动的过程中增加点音乐元素进来也会增多点动力。所以市面上出现了各种款式不一的运动耳机&#…

渗透测试之局域网信息探测实验

渗透测试之局域网信息探测实验实验目的一、实验原理1.1 SoftPerfect Network Scanner 流量监控软件二、实验环境2.1 操作机器2.2 SoftPerfectNetscan Scanner三、实验步骤1. 解压并运行SoftPerfect Network Scanner软件2. 使用SoftPerfect Network Scanner进行局域网信息探测实…

并发编程学习篇从0-1合集

一、synchronized 一、原子性、有序性、可见性 1.1 原子性 数据库的事务:ACID A:原子性-事务是一个最小的执行的单位,一次事务的多次操作要么都成功,要么都失败。 并发编程的原子性:一个或多个指令在CPU执行过程中…

JVM 锁优化和逃逸分析详解

1 锁优化JVM 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。1.1 自旋锁和自适应自旋现在大多的处理器都是多核处理器 ,如果在多核心处理器,有让两个或者以上的线程并行执行,我们可以让一个等待…

(免费分享)基于ssm的BBS社区论坛系统带论文

项目描述前台部分:1.用户注册登录模块用户登录后,可以进行发帖回帖功能,在线签到功能,完善个人信息,添加好友,收藏贴子,评论帖子,点赞功能,记录功能(比如记录今天发生的事情)等等…2.排行榜模块1.帖子讨论热度排行,分两种排行方式:(1) 根据用户今日发出的帖子被回复数量进行排名…

Linux USB 开发指南

文章目录Linux USB 开发指南1 前言1.1 文档简介1.2 目标读者1.3 适用范围2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 模块配置介绍2.3.1 Device Tree 配置说明2.3.2 board.dts 配置说明2.3.3 kernel menuconfig 配置说明2.4 源码结构介绍2.5 驱动框架介绍2.6 Gadget 配置2…

MySQL体系结构及数据库引擎

文章目录一、MYSQL的体系结构1、连接器2、查询缓存3、分析器(要做什么)4、优化器(怎么做)5、执行器6、数据库引擎1)mysql支持的引擎2)常用的mysql引擎比较3)索引组织表、堆组织表4)内…

大数据开发-Hive

1、hive简介 hive是基于Hadoop的一个数据仓库工具,用于分析数据的。可以将结构化数据文件映射为一张数据库表,并提供类SQL查询功能 注:hive-SQL or HQL or类SQL 和标准SQL还是有一点点区别的 本质是SQL转换为MapReduce程序 用途&#xff1…

Vulnhub靶场----6、DC-6

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-6下载地址:https://download.vulnhub.com/dc/DC-6.zip kali:192.168.144.148 DC-6:192.168.144.154 靶机描述:选择带k01的密码后面会用到 访问192.168.144.154&…

秒杀测试案例 Java Redis Mysql

基于redis和MySQL乐观锁实现秒杀优惠券场景,一人一单。MySQL乐观锁改良控制不出现超卖和少卖问题,使用redisson分布式锁在用户维度加锁控制一人一单。 源码:https://github.com/hanhanhanxu/SeckillTest 文中图片看不清的地方可以鼠标右键-&…