使用canvas压缩图片

  • 要用canvas实现前端的图片压缩,有几个步骤。
    1.拿到图片元素。
    2.绘制一个空白的canvas。
    3.将图片绘制在canvas上。
    4.将canvas转成base64。(这里调用的方法可以实现压缩,base64就可以直接放入src或者传入后端、转成别的格式传输等。)
    上代码
<!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>
 <img src="test.png" style="width: 200px; height: 400px;" id="imgBefore">
    <img src="" id="imgafter"> //待会压缩完的图片放入这里。
</body>
</html>
<script>
    var img = document.getElementById('imgBefore') //拿到图片元素
    img.setAttribute("crossOrigin",'Anonymous') //这句话并不是必要的,如果你的图片是一个网络链接,
    //那么canvas绘制时可能会报错,是因为跨域的安全性问题。报错时加上就对了。
    img.onload = ()=>{ //要确保图片已经加载完才进行绘制,不然拿不到图片元素会绘制出全黑的区域,就是失败。
        var width = img.width
        var height = img.height
        var canvas = document.createElement('canvas');
        var ctx = canvas.getContext('2d');
        canvas.width = width;
        canvas.height = height; //以上几步都在绘制一个canvas
        ctx.drawImage(img,0,0,width,height);//将图片绘制进去,这里第一个参数可以接受很多格式,
        //以元素为例子,详情https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/drawImage
        var base64 = canvas.toDataURL('image/jpeg',0.2); //第二个参数为压缩的比例,越小越模糊。0-1
        document.getElementById('imgafter').src = base64
    }
        
</script>
  • 效果
    在这里插入图片描述

明显模糊了很多,如果业务需求要用到,其实用工具更加方便。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在云函数中也可以使用 `canvas` 库来进行图片压缩处理,以下是使用 `canvas` 进行图片压缩的示例代码: ```javascript const cloud = require('wx-server-sdk') const { createCanvas, loadImage } = require('canvas') cloud.init() exports.main = async (event, context) => { // 获取文件 ID const fileID = event.fileID // 下载文件 const res = await cloud.downloadFile({ fileID: fileID }) // 读取文件内容 const buffer = res.fileContent // 使用 canvas 进行图片压缩 const image = await loadImage(buffer) const canvas = createCanvas(500, image.height * 500 / image.width) // 创建 Canvas 对象 const ctx = canvas.getContext('2d') ctx.drawImage(image, 0, 0, canvas.width, canvas.height) // 绘制图片Canvas 上 const compressedBuffer = canvas.toBuffer('image/jpeg') // 获取压缩后的图片 Buffer // 上传压缩后的图片到云存储 const result = await cloud.uploadFile({ cloudPath: 'compressed.jpg', fileContent: compressedBuffer }) // 返回压缩图片的文件 ID return result.fileID } ``` 上面的示例代码中,我们首先使用 `cloud.downloadFile()` 方法下载图片文件,然后使用 `loadImage()` 方法读取图片内容,接着创建一个指定宽度的 Canvas 对象,并使用 `ctx.drawImage()` 方法将图片绘制到 Canvas 上,最后使用 `canvas.toBuffer()` 方法获取压缩后的图片 Buffer。最后,使用 `cloud.uploadFile()` 方法将压缩后的图片上传到云存储中,并返回压缩图片的文件 ID。 需要注意的是,上面的示例代码中压缩后的图片格式为 JPEG,如果原图片为 PNG 格式,压缩后的图片格式需要修改为 `image/png`。同时,由于 Canvas 对象需要占用一定的内存,如果需要批量处理大量的图片,建议使用 `jimp` 等更轻量级的库进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值