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

news2024/9/23 15:24:09

一、具体代码

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

toDataURL

Data URL

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

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

相关文章

Python自动化测试-使用Pandas来高效处理测试数据

Python自动化测试-使用Pandas来高效处理测试数据 目录:导读 一、思考 二、使用pandas来操作Excel文件 三、使用pandas来操作csv文件 四、总结 一、思考 1.Pandas是什么? 功能极其强大的数据分析库可以高效地操作各种数据集 csv格式的文件Excel文件H…

Python3-基本数据类型

Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号&…

注意力机制笔记——结合沐神和B站老弓up主

B站【大白话浅谈【注意力机制】】 聚类 是针对 样本, 注意力机制是针对样本相关性,来进行计算的 自注意力机制 指的是 query ,key,value都是同一个部分。 可以学到 类似的 短语 ,和 语义特征。如its 指代的对象。 评论区大佬 根据这篇论文《Effective Approaches to…

[ vulhub漏洞复现篇 ] Drupal 远程代码执行漏洞(CVE-2018-7602)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

设计模式之各种设计模式总结与对比

目录1 目标2 定位3 一句话归纳设计原则4 G0F 23种设计模式简介5 设计模式使用频次总结6 —句话归纳设计模式7 设计模式之间的关联关系和对比1 目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring…

利用React实现多个场景下的鼠标跟随框提示框

前言 鼠标跟随框的作用如下图所示,可以在前端页面上,为我们后续的鼠标操作进行提示说明,提升用户的体验。本文将通过多种方式去实现,从而满足不同场景下的需求。 实现原理 实现鼠标跟随框的原理很简单,就是监听鼠标在…

删除链表的倒数第N个节点

题目描述19. 删除链表的倒数第 N 个结点难度中等2410收藏分享切换为英文接收动态反馈给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例 1:输入:head [1,2,3,4,5], n 2输出:[1,2,3,5]示例 2&#…

【ROS】Windows系统安装ROS体验

大家平时玩ROS都是在Ubuntu系统上,那Windows系统可以安装吗,答案是:可以的!Windows为了发展自家的物联网生态,已经在Windows系统支持ROS了。 文章目录1.安装VS 20172.安装Chocolatey & Git3.安装ROS4.运行ROS例程1…

RabbitMQ核心内容:实战教程(java)

文章目录一、安装二、入门1.分类2.核心概念3.工作原理4.六大模式三、模式一:"Hello World!"1.依赖2.生产者代码3.消费者代码四、模式二:Work Queues1.工作原理2.工具类代码:连接工厂3.消费者代码4.生产者代码5.分发策略不公平分发预…

计算机网络第2章(物理层)学习笔记

❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…

Metasploit 使用篇

文章目录前言一、msfconsole启动msfconsole命令分类核心命令模块命令作业命令资源脚本命令后台数据库命令二、使用案例更改提示和提示字符运行shell命令信息收集:HTTP头检测前言 理解了Meatasploit框架架构、原理之后,自然就很好理解它的使用逻辑 find…

springmvc java ssm药店库存进销存管理系统带前台

基于JSP技术、SSM框架、B/S机构、Mysql数据库设计并实现了龙康药店管理系统。系统主要包括药店简介管理、客户信息管理、药品信息管理、入库信息管理、出库信息管理、进货单管理等功能模块。其特点一是方便学习,方便快捷;二是有非常大的信息储存量&#…

Games101-202作业1

一. 将模型从模型空间变换到世界空间下 在这个作业下,我们主要进行旋转的变换。 二.视图变换 ,将相机移动到坐标原点,同时保证物体和相机进行同样的变换(这样对形成的图像没有影响) 在这个作业下我们主要进行摄像机的平移变换&am…

【深度学习编译器系列】1. 为什么需要深度学习编译器?

本系列是自学深度学习编译器过程中的一些笔记和总结,参考文献在文末。 1. 概述 深度学习(DL)编译器的产生有两方面的因素:深度学习模型的广泛应用,以及深度学习芯片的层出不穷。 一方面,我们现在有非常多…

剑指 Offer 34. 二叉树中和为某一值的路径(java解题)

剑指 Offer 34. 二叉树中和为某一值的路径(java解题)1. 题目2. 解题思路3. 数据类型功能函数总结4. java代码1. 题目 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶…

关于MySQL的limit优化

1、前提 提示:只适用于InnoDB引擎 2、InnoDB存储特点 它把索引和数据放在了一个文件中,就是聚集索引。这与MyISAM引擎是不一样的。 3、SQL示例 -- 给cve字段建立索引 select * from cnnvd where cveCVE-2022-24808 limit 300000,10;由于M…

ACWING/1824. 钻石收藏家

输出格式 输出贝茜可以在展示柜中展示的钻石最大数量。 数据范围 1≤N≤1000 0≤K≤10000 钻石的尺寸范围 [1,10000]输入样例: 5 3 1 6 4 3 1输出样例: 4排序双指针 常规解法 将数据进行排序,形成一个有序单调增加的数组。然后左指针不…

【C语言每日一题】——猜凶手

【C语言每日一题】——猜名次😎前言🙌猜凶手🙌解题思路分享:😍解题源码分享:😍总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神…

Spring中的数据校验

数据校验基础 参考: Java Bean Validation 规范 Spring对Bean Validation的支持 Spring定义了一个接口org.springframework.validation.Validator,用于应用相关的对象的校验器。 这个接口完全从基础设施或者上下文中脱离的,这意味着它没有…

【Java基础】Java语言特性

认识Java java语言的执行过程 编写纯文本文件 .java 经过javac编译器(java complier)编译 .class .class是二进制的字节码 在源文件中定义几个类,就会生成几个 由JVM运行 .class JVM把字节码编译成可以在处理器上运行的高性能的本地代码(native code),…