如何实现图片压缩

文章目录

    • 1、canvas实现图片压缩
    • 2、其他

1、canvas实现图片压缩

canvas 实现图片压缩,主要是使用 canvasdrawImage 方法

具体思路

  1. 拿到用户上传的文件
  2. 转成base64
  3. 创建一个 Image,主要是获取到这个图片的宽度和高度
  4. 创建一个 2D 的画布,画布的宽高就是 图片的宽高
  5. drawImage 渲染图片
  6. toDataURL 生成 base64 地址(这个方法第二个参数,可以设置输出质量

本来图片是 1.4MB, 输出质量是 0.5,转化后的大小是 523KB

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <input type="file" name="" id="file">
  <script>
    const fileEl = document.getElementById('file');
    fileEl.onchange = function (e) {
      const file = e.target.files[0];
      const reader = new FileReader()
      reader.onload = async function (e) {
        console.log('原始图片大小', e.target.result);
        console.log('压缩后的大小', await compressImg(e.target.result));
      }
      reader.readAsDataURL(file)


      function compressImg(base64Data, compressRatio = 0.5) {
        // 目的是为了拿到 图片的宽高,方便渲染canvas的时候定义画布大小
        return new Promise((resolve, reject) => {
          const img = new Image()
          img.src = base64Data
          document.body.append(img)
          img.onload = function () {
            const canvas = document.createElement('canvas')
            const ctx = canvas.getContext('2d')
            canvas.width = img.width
            canvas.height = img.height
            ctx.drawImage(img, 0, 0) // 图片,裁剪的x,裁剪的y,宽,高
            const dataURL = canvas.toDataURL('image/jpeg', compressRatio) // 第一个参数:文件类型,第二个参数:输出图片的质量 0-1
            // console.log(dataURL, 'dataURL');
            resolve(dataURL)
          }
        })
      }
    }
  </script>
</body>

</html>

2、其他

  • 图片裁剪,可以使用 Sharp(https://sharp.pixelplumbing.com/)、Jimp(http://jimp.readthedocs.io/en/latest/)
  • 图片压缩,可以使用 Compressor.js

一般是 可以使用 shape 进行裁剪

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RS485浪涌防护经验分享

对于一些室外的产品&#xff0c;485信号可能会引出&#xff0c;长期暴露在户外&#xff0c;并且走线还会比较长&#xff0c;所以对于户外485信号浪涌防护是必不可少的。 非隔离的485信号典型的防护电路就是这个&#xff0c;防护器件包括气体放电管&#xff0c;PTC自恢复保险丝…

高阶函数和函数的柯里化

一、高阶函数 定义&#xff1a; 如果一个函数符合下面2个规范中的任何一个&#xff0c;那该函数就是高阶函数&#xff1a; 1、若 A 函数&#xff0c;接受的参数是一个函数&#xff0c;那么 A 就可以称为高阶函数。2、若 A 函数&#xff0c;调用的返回值依然是一个函数&#x…

Maxwell数据同步(增量)

1. Maxwell简介 1.1 Maxwell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流…

2023年总结:雄关漫道真如铁,而今迈步从头越,今朝得失

2023年悄然离去&#xff0c;感谢大家的帮助、鼓励和陪伴&#xff0c;感谢家人的理解和支持&#xff0c;祝大家新年快乐&#xff0c;阖家幸福&#xff0c;身体健康。像往常一样&#xff0c;今年也会写一篇年终总结&#xff0c;也是自己的第11篇年终总结&#xff0c;题目就叫《雄…

Vue中ElementUI结合transform使用时,修复el-select弹框定位不准确问题

在大屏开发中&#xff0c;比如将1920*1080放到更大像素&#xff08;3500*2400&#xff09;大屏上演示&#xff0c;此时需要使用到transform来对页面进行缩放&#xff0c;但是此时发现弹框定位出错问题&#xff0c;无法准备定位到实际位置。之前写过一篇讲解的是ElementUI中的&l…

离线加载huggingface模型

huggingface 本地加载模型 源码位置&#xff1a; /home/anaconda3/envs/Cap3D/lib/python3.8/site-packages/huggingface_hub/file_download.py阅读里面的函数&#xff0c;可以知道下载的文件 url 和存储位置 def hf_hub_download(... ) -> str:"""Downlo…

go的安装及配置

go的官方下载地址&#xff1a;All releases - The Go Programming Language​​​​​​ 1、找到对应的版本包下载&#xff0c;例如 wget https://golang.google.cn/dl/go1.21.6.linux-amd64.tar.gz 2、下载完成后配置解压Go源码包 tar -zxf go1.21.6.linux-amd64.tar.gz 3…

LeetCode 144. 94. 145. 二叉树的前序,中序,后续遍历(详解) ੭ ᐕ)੭*⁾⁾

经过前面的二叉树的学习&#xff0c;现在让我们实操来练练手~如果对二叉树还不熟悉的小伙伴可以看看我的这篇博客~数据结构——二叉树&#xff08;先序、中序、后序及层次四种遍历&#xff08;C语言版&#xff09;&#xff09;超详细~ (✧∇✧) Q_Q-CSDN博客 144.二叉树的前序遍…

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)

文章目录 前言Docekr镜像命令 Docekr镜像命令容器操作创建容器查看容器日志查看容器状态进入容器 数据卷数据集操作命令给nginx挂载数据卷给MySQL挂载本地目录 Dockerfile自定义镜像镜像结构 使用Dockerfile构建Java项目基于Ubuntu构建Java项目基于java8构建Java项目 Docker-Co…

API接口用例生成器

1、前言 随着自动化测试技术的普及&#xff0c;已经有很多公司或项目&#xff0c;多多少少都会进行自动化测试。 目前本部门的自动化测试以接口自动化为主&#xff0c;接口用例采用 Excel 进行维护&#xff0c;按照既定的接口用例编写规则&#xff0c;对于功能测试人员来说只…

[渗透测试学习] Hospital - HackTheBox

文章目录 信息搜集getshell提权信息搜集 nmap扫描一下端口 发现8080端口和443端口有http服务 然后发现3389端口是启用了ms-wbt-server服务 在对443端口的扫描没有收获,并且只有邮箱登录界面无法注册 接着看向8080端口,我们随便注册用户登录后发现有文件上传功能 getshell …

随心玩玩(十三)Stable Diffusion初窥门径

写在前面&#xff1a;时代在进步&#xff0c;技术在进步&#xff0c;赶紧跑来玩玩 文章目录 简介配置要求安装部署下载模型启动ui插件安装教程分区提示词插件Adetailer插件提示词的分步采样采样器选择采样器的收敛性UniPC采样器 高分辨率修复 (Hires. fix)图生图ControlNet介绍…

无需编程,简单易上手的家具小程序搭建方法分享

想要开设一家家具店的小程序吗&#xff1f;现在&#xff0c;我将为大家介绍如何使用乔拓云平台搭建一个家具小程序&#xff0c;帮助您方便快捷地开展线上家具销售业务。 第一步&#xff0c;登录乔拓云平台进入商城后台管理页面。 第二步&#xff0c;在乔拓云平台的后台管理页面…

一文彻底解析 Compose 的穿透刺客 -- CompositionLocal

Compose 官方说明一直很简洁&#xff1a;CompositionLocal 是通过组合隐式向下传递数据的工具。 两个核心&#xff1a;隐式、向下传递&#xff0c;咋一看很懵&#xff0c;先不着急去理解&#xff0c;我们先看一段非常简单的代码&#xff1a; class MainActivity : ComponentAc…

c语言for循环和水仙花

c语言for循环和水仙花 c语言for循环和水仙花 c语言for循环和水仙花一、for循环语句格式二、for循环案例水仙花 一、for循环语句格式 for(初始值&#xff1b;表达式&#xff1b;表达式) { 代码 }int main() {for (int i 0; i < 10; i){printf("%d\n", i);} }二、f…

Protobuf小记(万字)

Protobuf小记 序列化概念序列化和反序列化 ProtoBuf 初识快速上手通讯录 1.0通讯录 1.0 - 函数 API 小结 编译 contacts.proto 文件&#xff0c;生成 C 文件 proto 3 语法详解字段规则消息类型的定义与使用定义 通讯录 2.0通讯录 2.0 的写入实现通讯录 2.0 的输出实现通讯录 2.…

Java 线程

1. 实现多线程的 2 种方式 Oracle 官网的文档中给出了 2 种实现多线程的方式&#xff1a; 实现 Runnable 接口&#xff1b;继承 Thread 类。 以上两种方式都会调用 Thread.run() 方法&#xff0c;区别是&#xff1a; 实现 Runnable 接口&#xff0c;只是执行 Thread.run() …

数仓面试之手写拉链表SQL,并分析有多少个job

数仓面试之手写拉链表SQL&#xff0c;并分析有多少个job 拉链表定义 维护历史状态&#xff0c;以及最新状态数据的一种表&#xff0c;拉链表根据拉链粒度的不同&#xff0c;实际上相当于快照&#xff0c;只不过做了优化&#xff0c;去除了一部分不变的记录而已,通过拉链表可以…

Nginx——强化基础配置

1、牢记Context Context是Nginx中每条指令都会附带的信息&#xff0c;用来说明指令在哪个指令块中使用&#xff0c;可以将Context 理解为配置环境。 每个指令都拥有自己的配置环境&#xff0c;如果把配置环境记错了&#xff0c;或者在设计时未考虑配置环境的作用&#xff0c;…

第十二章 Java内存模型与线程(二)

文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.4 Java与线程 12.4.1 线程的实现 实现线程主要有三种方式&#xff1a;使用内核线程实现&#xff08;1&#xff1a; 1 实现&#xff09;&#xff0c;使用用户线程实现&#xff08;1&#xff…