【JS】如何实现图片压缩

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 进行裁剪

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤使用 HTML 和 JavaScript 实现图片压缩并上传到服务器: 1. 在 HTML 文件中创建一个 input 元素,使用户可以选择要上传的图片文件: ```html <input type="file" id="file-input"> ``` 2. 使用 JavaScript 获取用户选择的图片文件,并将其转换为 base64 格式: ```javascript const fileInput = document.getElementById('file-input'); const file = fileInput.files[0]; const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function() { const base64Image = reader.result; }; ``` 3. 使用 JavaScript 创建一个 Image 对象,加载用户选择的图片文件,并在加载完成后将其绘制到一个 Canvas 上: ```javascript const img = new Image(); img.src = base64Image; img.onload = function() { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); // 设置 Canvas 大小为图片大小 canvas.width = img.width; canvas.height = img.height; // 在 Canvas 上绘制图片 ctx.drawImage(img, 0, 0); // 获取 Canvas 上的压缩后的图片数据 const compressedImage = canvas.toDataURL('image/jpeg', 0.5); }; ``` 在这个例子中,我们将图片压缩为质量为 50% 的 JPEG 格式。 4. 创建一个 XMLHttpRequest 对象,将压缩后的图片数据作为请求体发送到服务器: ```javascript const xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(`image=${encodeURIComponent(compressedImage)}`); ``` 在这个例子中,我们将压缩后的图片数据作为 image 参数发送到服务器。 完整的 HTML 和 JavaScript 代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图片上传</title> </head> <body> <input type="file" id="file-input"> <button id="upload-btn">上传</button> <script> const fileInput = document.getElementById('file-input'); const uploadBtn = document.getElementById('upload-btn'); fileInput.addEventListener('change', function() { const file = fileInput.files[0]; const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function() { const base64Image = reader.result; const img = new Image(); img.src = base64Image; img.onload = function() { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); // 设置 Canvas 大小为图片大小 canvas.width = img.width; canvas.height = img.height; // 在 Canvas 上绘制图片 ctx.drawImage(img, 0, 0); // 获取 Canvas 上的压缩后的图片数据 const compressedImage = canvas.toDataURL('image/jpeg', 0.5); uploadBtn.addEventListener('click', function() { const xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(`image=${encodeURIComponent(compressedImage)}`); }); }; }; }); </script> </body> </html> ``` 请注意,这只是一个简单的示例,实际应用中还需要考虑更多的因素,例如图片大小限制、上传进度显示、错误处理等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值