前端性能优化:使用Vue3+TS+Canvas对图片进行压缩后再上传,优化带宽,减小服务器存储成本,减少流量损耗

news2024/9/21 18:56:08
在上传图片之前,对图片进行压缩。看到这里是不是有点懵,前端怎么压缩图片呢,这不应该是后端做的吗?
但是我在开发的时候接到了这样一个需求,要求对用户上传的图片进行一定的压缩,而且并且尽量还原图片的清晰度。
那么对图片上传进行一个压缩的好处在哪里
  1. 提升用户体验
    • 减少图片加载时间,加快页面渲染速度。
    • 对于移动设备来说尤为重要,可以减少流量消耗。
  2. 节省服务器资源
    • 减小上传文件的大小,降低服务器存储成本。
    • 减轻服务器处理图片的压力。
  3. 优化网络传输
    • 在带宽有限的情况下,压缩后的图片可以更快地传输到服务器端。
坏处呢

显而易见,加大工作量,当然,图片也有可能会变得比较模糊(这也是我们要处理的)

本来开发没有引入任何的库,纯手写

使用技术栈为Vue3+Ts+Canvas

再开始之前需要了解部分前置知识,关于图片压缩的类型,压缩时我们会把图片的类型修改为**“image/jpeg”**,为什么呢?

JPEG(Joint Photographic Experts Group)是一种广泛使用的有损压缩图像格式,适用于照片和其他具有丰富色彩和细节的图像。JPEG 格式的主要优点是它能够提供高质量的图像同时保持较小的文件大小,这对于网络传输和存储来说是非常重要的。
兼容性:JPEG 格式在大多数浏览器和设备上都得到了很好的支持。
文件大小:JPEG 可以通过调整质量因子来控制输出文件的大小,这使得它非常适合在网络上传输。
颜色和细节:对于包含大量颜色和细节的照片来说,JPEG 通常能够提供足够的视觉质量。
质量参数:quality 参数只对某些格式有效,如 JPEG。这里使用 "image/jpeg" 可以确保 quality 参数被正确应用。

接下来就开始我们的编码,具体注释,案例,实现都在代码中有所解释

页面,引入的arco-design组件库的上传组件
<template>
  <div>
    <a-upload
      :auto-upload="false"
      ref="uploadRef"
      @change="fileChange"
      multiple
      draggable
    >
    </a-upload>
  </div>
</template>
逻辑
<script setup lang="ts">
let fileNum = 0;
const fileChange = async (files) => {
  let file = files[fileNum].file;
  console.log(file, "压缩之前");
  // 用户还可能传其他的,只压缩图片,并且太小的图片都不进行处理
  if (file.type.includes("image") && file.size >= 102400) {
    file = await imageZip(file, 800, 600, 0.8);
  }
  console.log(file, "压缩之后");
  //这里书写你的上传逻辑,根据自身的接口来上传
};

const imageZip = (file: File, maxWidth: number,maxHeight: number,quality: number) => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    // 使用readAsDataURL方法十分适合用来读取图片文件,并将其转换为Base64编码的Data URL格式。
    reader.readAsDataURL(file);
    // 此时再使用reader.onload事件处理器,对图片进行处理
    reader.onload = function (event) {
      const img = new Image();
      // 将base64的值赋值给img以便后续处理
      img.src = event.target.result;
      img.onload = function () {
        let width = img.width;
        let height = img.height;
        // 这里是对图片做宽高自适应
        if (width > maxWidth) {
          height *= maxWidth / width;
          width = maxWidth;
        }
        if (height > maxHeight) {
          width *= maxHeight / height;
          height = maxHeight;
        }
        // 创建一个Canvas
        const canvas = document.createElement("canvas");
        canvas.width = width;
        canvas.height = height;
        const ctx = canvas.getContext("2d");
        /**
         img: 要绘制的 Image 对象。
         0: 目标位置的 x 坐标。
         0: 目标位置的 y 坐标。
         width: 绘制的宽度。
         height: 绘制的高度。
        */
        ctx.drawImage(img, 0, 0, width, height);
        // 直接使用canvas.toBlob()来创建压缩后的Blob对象
        //
        canvas.toBlob(
          (blob) => {
            const files = new File([blob], file.name, { type: file.type });
            resolve(files);
          },
          //指定类型,原因前面也解释了
          "image/jpeg",
          // 控制质量,越小图片体积就越小,当然也会更加模糊
          quality
        );
      };
    };
  });
};
</script>

我专门写了一个后台,来看图片的体积变化,总结:越大的图片压缩后,体积变化越大,同时后台查看图片也没有丢失精度
在这里插入图片描述

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

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

相关文章

大模型如何改变世界?李彦宏:未来至少一半人要学会“提问题“

2023年爆火的大模型&#xff0c;对我们来说意味着什么&#xff1f; 百度创始人、董事长兼CEO李彦宏认为&#xff0c;“大模型即将改变世界。” 5月26日&#xff0c;李彦宏参加了在北京举办的2023中关村论坛&#xff0c;发表了题为《大模型改变世界》的演讲。李彦宏认为&#…

2024年新算法-基于SBOA-BP混合神经网络的数据预测(Python代码实现)

在今天的数字化时代&#xff0c;机器学习和人工智能领域的不断发展为数据处理和预测提供了强大的工具。其中&#xff0c;BP神经网络&#xff08;反向传播神经网络&#xff09;作为一种经典的网络模型&#xff0c;因其能够处理复杂的非线性问题而备受关注。然而&#xff0c;传统…

吴恩达机器学习课后作业-07kmeans and pca

k-均值与PCA k-均值图片颜色聚类 PCA&#xff08;主成分分析&#xff09;对x去均值化图像降维 k-均值 K-均值是最普及的聚类算法&#xff0c;算法接受一个未标记的数据集&#xff0c;然后将数据聚类成不同的组。 K-均值是一个迭代算法&#xff0c;假设我们想要将数据聚类成n个…

python-变量声明、数据类型、标识符

一.变量 1.什么是变量 为什么需要变量呢&#xff1f; 一个程序就是一个世界&#xff0c;不论使用哪种高级程序语言编写代码&#xff0c;变量都是其程序的基本组成单位。如下图所示的sum和sub都是变量。 变量的定义&#xff1a; 变量相当于内存中一个数据存储空间的表示&#…

Spring MVC常用注解及用法

目录 1.建立连接--RequestMapping 2.请求 2.1 传递单个参数 2.2 传递多个参数 2.3 传递对象 2.4 参数重命名--RequestParam 2.5 传递数组 2.6 传递集合 2.7 传递json数据--RequestBody 2.8 获取URL中参数--PathVariable 2.9 上传文件--RequestPart 2.10 获取Cookie--…

bomb 实验

GDB常用命令&#xff1a; GDB调试常用命令-CSDN博客 原理&#xff1a; 编译与反汇编过程-CSDN博客 Bomb实验实现 阶段一&#xff1a; 分析 分配空间&#xff1a;sub $0x8,%rsp 为局部变量分配栈空间。设置参数&#xff1a;mov $0x402400,%esi 将字符串地址加载到 %esi。…

MMsegmentation与MMdeploy简单使用

最近涉及到了图像分割的任务&#xff0c;于是拿来写下博客加深下使用。 MMsegmentation与MMdeploy的环境配置暂不做讲解&#xff0c;在官网和其他博客中有很多说明。 MMdeploy主要是把pt转为 onnx_int8的情况。 MMsegmentation环境配置可以参考 : 安装与配置MMSegmentation 目录…

【管理型文档】软件需求管理过程(原件)

软件需求管理规程应明确需求收集、分析、确认、变更控制及验证等流程&#xff0c;确保需求准确反映用户期望&#xff0c;支撑软件开发。该规程要求系统记录需求来源&#xff0c;通过评审确保需求完整、清晰、无歧义&#xff0c;实施变更控制以维护需求基线稳定&#xff0c;并持…

后端面试真题整理

面试问题整理 本人主要记录2024年秋招、春招过程中的疑难八股真题&#xff0c;参考来源&#xff1a;牛客网、知乎等。 八股 深拷贝与浅拷贝 浅拷贝&#xff1a; 浅拷贝会在堆上创建一个新的对象&#xff08;区别于引用拷贝的一点&#xff09;&#xff0c;不过&#xff0c;如果…

井盖丢失隐患大?智慧井盖监管系统帮你解决

在现代都市中&#xff0c;我们每天行走在钢筋水泥之间&#xff0c;却很少有人注意到脚下的小小井盖。这些不起眼的圆形铁盘不仅是城市地下管网的入口&#xff0c;更是维系城市生命线的重要组成部分。然而&#xff0c;当暴雨来袭&#xff0c;或是深夜无人之时&#xff0c;井盖的…

无线麦克风什么牌子的音质效果好?一文读懂麦克风哪个牌子的好

无线领夹麦克风哪款音质最好&#xff1f;在这个追求高质量音效的年代&#xff0c;选择一款合适的无线领夹麦克风&#xff08;简称领夹麦&#xff09;对于提升录音或直播的音质至关重要。随着市场的不断扩大&#xff0c;市面上充斥着大量信号不稳定、音质差的无线领夹麦克风&…

2024年汽车零部件企业CRM研究:服务商排名、案例分析、需求分析

最近媒体上频现各车企大佬发声&#xff0c;抗议某汽车企业“不要卷价格&#xff0c;要卷长期价值”&#xff0c;还有的直接批判其打破行业规则。图穷匕现&#xff0c;汽车行业的竞争愈发激烈了。 汽车产业作为我国国民经济的重要支柱产业、经济增长和转型的重要抓手&#xff0…

微软将持续多年的 Mono 项目移交给 Wine

今天&#xff0c;微软突然决定将 Mono 项目交由 Wine 开发社区管理。自Mono项目上一次作为开源.NET框架发布以来&#xff0c;已经过去了五年时间&#xff0c;此前Wine已经使用了Mono的代码&#xff0c;而在微软专注于开源.NET和其他工作的情况下&#xff0c;此举是合理的&#…

Python编程的终极十大工具(非常详细)零基础入门到精通,收藏这一篇就够了

&#x1f91f; 基于入门网络安全打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 Python一直以来都是程序员们的首选编程语言之一&#xff0c;其灵活性和功能强大的库使其成为解决各种问题的理想选择。在本文中&#xff0c;我们将介绍Python编程的终…

fdMemTable内存表进行SQL查询

fdLocalSql可以对fdMemTable内存表进行SQL查询&#xff08;可以对多个fdMemTable内存表进行联表查询哦&#xff09;&#xff0c;fdLocalSql使用SQLITE引擎&#xff0c;而FIREDAC驱动SQLITE&#xff0c;连SQLITE驱动DLL都不需要附带的。 所有设置用FormCreate里用代码 procedure…

【C#】Visual Studio2017 MSDN离线安装

1. 运行Visual Studio Installer 在Windows的开始菜单中直接搜索 2. 单击“修改”按钮 3. 依次点击&#xff0c;单个组件 - 代码工具 - Help Viewer - 修改&#xff0c;开始安装 4. 下载速度慢解决方法 修改IPv4 DNS 参考&#xff1a;visual studio下载慢解决方法&#xf…

unity脚本

Transform.Rotate 描述 使用 Transform.Rotate 以各种方式旋转 GameObjects。通常以欧拉角而不是四元数提供旋转。 可以在世界轴或本地轴中指定旋转。 世界轴旋转使用 Scene 的坐标系&#xff0c;因此在开始旋转 GameObject 时&#xff0c;它的 x、y 和 z 轴与 x、y 和 z 世…

Leetcode 131.分割回文串 回溯 C++实现

Leetcode 131. 分割回文串 问题&#xff1a;给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 算法&#xff1a; 创建二维返回数组 ans &#xff0c;和临时数组 path 。 进入 dfs 函数&#xff0c;当 …

初识linux(1)

linux背景 1991年10月5日&#xff0c;赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组 &#xff08;comp.os.minix&#xff09;中宣布他编制出了一种类似UNIX的小操作系统&#xff0c;叫Linux。新的操作系统是受到另 一个UNIX的小操作系统——Minix的启发…

今日arXiv最热大模型论文:港大微软发布AgentGen提高大模型规划能力,8B模型接近GPT-4水平

夕小瑶科技说 原创 作者 | Richard 在大语言模型&#xff08;LLM&#xff09;问世之后&#xff0c;基于 LLM 的 Agent 引起了广泛的关注并且变得越来越流行。规划能力无论对人类还是 Agent 都是一个重要的决策步骤&#xff0c;规划的本质是通过预先设定的行动过程&#xff0c…