首页 > 其他分享 >使用Canvas封装图片压缩功能

使用Canvas封装图片压缩功能

时间:2024-07-08 11:12:29浏览次数:8  
标签:Canvas const 压缩 canvas 封装 上传 image 图片

最近在学习和工作中遇到这样一个场景:如何将前端上传的图片进行压缩传递给服务端?因为此前从未了解过图片压缩的功能,所以也是带着好奇进行了一番学习,那么我的解决思路如下展示

整体思路

  1. 创建input框实现图片上传
  2. 将上传的文件转成base64格式
  3. 前端通过base64进行原始图片展示,并将此图片进行压缩
  4. 将压缩后的图片传给服务器

代码实现

首先我们要实现input上传文件并做一些细节处理,细节处理要对上传的文件类型和上传的文件大小做限制,类型和大小这里我们可以根据规则自定义。

<div class="container">
    <input type="file" id="upload" />
</div>
const ACCEPT = ['image/jpg', 'image/png', 'image/jpeg'] // 所能接受的类型(自定义)
const MAXSIZE = 3 * 1024 * 1024 // 上传图片大小限制(自定义)
const MAXSIZE_STR = '3MB'
const upload = document.getElementById('upload')
upload.addEventListener('change', (e) => {
    const [file] = e.target.files
    if (!file) return // 上传文件为空时终止
    const { type: fileType, size: fileSize } = file
    // 类型判断
    if (!ACCEPT.includes(fileType)) {
        alert('不支持' + fileType + '文件类型')
        upload.value = ''
        return
    }
    // 图片大小判断
    if (fileSize > MAXSIZE) {
        alert(`文件超出${MAXSIZE_STR}限制`)
        upload.value = ''
        return
    }
    // 压缩图片
    covertImageToBase64(file, (base64Image) =>
        compress(base64Image, uploadServer)
    )
})

 

当所有限制都通过之后,就要将图片转为base64格式,也就是进入到covertImageToBase64函数,我们来看看这个函数做了什么

function covertImageToBase64(file, callback) {
    let reader = new FileReader()
    reader.readAsDataURL(file) // 读取二进制数据,并将其编码为 base64 的 data url

    // 读取完成进行下面操作
    reader.addEventListener('load', function (e) {
        const base64Image = reader.result
        callback && callback(base64Image) // 将读取到的结果传递给回调函数中
        reader = null
    })
}

 

 

这里我们要将上传获取的_file_进行编码转换,通过FileReaader[1]构造函数中的 readAsDataURL[2]方法进行转换,将编码后的格式文件传递给回调函数中准备进行压缩处理

到这里这里为了方便大家的理解,我做了一个动图方便观看效果,样式比较简陋

标签:Canvas,const,压缩,canvas,封装,上传,image,图片
From: https://www.cnblogs.com/wxyblog/p/18289499

相关文章

  • canvas—元素样式设置
    一、色彩:fillStyle=colorstrokeStyle=color二、透明度: 三、线型:设置线条宽度:lineWidth=value设置线条末端样式:lineCap=type设定线条与线条间接合处的样式:lineJoin=type限制当两条线相交时交接处最大长度:miterLimit=value ......
  • React+TS前台项目实战(二十六)-- 高性能可配置Echarts图表组件封装
    文章目录前言CommonChart组件1.功能分析2.代码+详细注释3.使用到的全局hook代码4.使用方式5.效果展示总结前言Echarts图表在项目中经常用到,然而,重复编写初始化,更新,以及清除实例等动作对于开发人员来说是一种浪费时间和精力。因此,在这篇文章中,将封装一个“高......
  • 硬件开发笔记(二十三):贴片电阻的类别、封装介绍,AD21导入贴片电阻原理图封装库3D模型
    前言  电阻,电容,电感还有各种基础的电子元器件、连接器和IC构成了各种实现功能的电子电路。  本篇介绍贴片电阻,并将贴片电阻封装导入AD21,预览其三维模型。 贴片电阻    贴片电阻(SMDResistor)作为一种不可或缺的电子元件,广泛应用于各种电路和设备中。其体积......
  • 网络数据传输中的封装与解封装详解
    注:机翻,未校对。Thegoalofnetworksistotransmitdatafromonehosttoanother.网络的目标是将数据从一个主机传输到另一个主机。Encapsulation封装Toachievethisgoal,eachlayeraddsitsownheadertothedata.Aheadercontainsinformationspecific......
  • 基于FPGA的A律压缩解压缩verilog实现,包含testbench
    1.算法仿真效果VIVADO2019.2仿真结果如下(完整代码运行后无水印):   RTL图如下所示:   2.算法涉及理论知识概要       A律压缩是一种广泛应用于语音编码的非均匀量化技术,尤其在G.711标准中被欧洲和中国等国家采纳。该技术的核心目的是在有限的带宽下高效传输......
  • STM32封装ESP8266一键配置函数:实现AP模式和STA模式切换、服务器与客户端创建
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)STM32封装ESP8266一键配置函数:实现AP模式和STA模式切换、服务器与客户端创建......
  • Java--封装详解
    1.该漏的漏,该藏的藏    我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用2.封装(数据的隐藏)私有:private    通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问......
  • 四种封装 ThreadPoolExecutor 的线程池的使用以及直接使用 ThreadPoolExecutor ,优缺点
    池化思想:线程池、字符串常量池、数据库连接池提高资源的利用率下面是手动创建线程和执行任务过程,可见挺麻烦的,而且线程利用率不高。手动创建线程对象执行任务执行完毕,释放线程对象线程池的优点:提高线程的利用率提高程序的响应速度便于统一管理线程对象可以控制最大并发......
  • 小国王 骑士 状态压缩DP
    //小国王.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<vector>usingnamespacestd;/*https://loj.ac/p/10170http://ybt.ssoier.cn:8088/problem_show.php?pid=1592在nxn的棋盘上放k个国王,国王可攻击相邻的......
  • AntDesign上传组件upload二次封装+全局上传hook使用
    文章目录前言a-upload组件二次封装1.功能分析2.代码+详细注释3.使用到的全局上传hook代码4.使用方式5.效果展示总结前言在项目中,ant-design是我们常用的UI库之一,今天就来二次封装常用的组件a-upload批量上传组件,让它用起来更方便。a-upload组件二次封装1.......