使用canvas压缩图片

使用canvas压缩图片,图片不容易失真变形。

1.首先在js文件写入


/** 图片压缩,默认同比例压缩
 *  @param {Object} fileObj
 *  图片对象
 *  回调函数有一个参数,base64的字符串数据
 */
export function compress(fileObj, callback) {
    try {
        const image = new Image()
        image.src = URL.createObjectURL(fileObj)
        image.onload = function () {
            const that = this
            // 默认按比例压缩
            let w = that.width
            let h = that.height
            const scale = w / h
            w = fileObj.width || w
            h = fileObj.height || (w / scale)
            let quality = 0.7 // 默认图片质量为0.7
            // 生成canvas
            const canvas = document.createElement('canvas')
            const ctx = canvas.getContext('2d')
            // 创建属性节点
            const anw = document.createAttribute('width')
            anw.nodeValue = w
            const anh = document.createAttribute('height')
            anh.nodeValue = h
            canvas.setAttributeNode(anw)
            canvas.setAttributeNode(anh)
            ctx.drawImage(that, 0, 0, w, h)
            // 图像质量
            if (fileObj.quality && fileObj.quality <= 1 && fileObj.quality > 0) {
                quality = fileObj.quality
            }
            // quality值越小,所绘制出的图像越模糊
            const data = canvas.toDataURL('image/jpeg', quality)
            // 压缩完成执行回调
            const newFile = convertBase64UrlToBlob(data)
            callback(newFile)
        }
    } catch (e) {
    }
}

2.在自定义公共组件Global.vue中引入创建全局变量

<script>
import { getToken } from "@/utils/auth";
import { compress } from "@/utils/index";
const fileUrl = "";
const token = getToken();
const myHeaders = { token: token };
export default {
  fileUrl, //附件地址
  myHeaders, //element-ui上传带token
  compress //压缩图片函数
};
</script>

3.在main.js,注册全局文件

// 定义全局 变量
import global_ from '@/components/Global/Global.vue'//引用文件
Vue.prototype.GLOBAL = global_//挂载到Vue实例上面

4.在文件中使用

 fileChangePlans(file, fileList) {
      this.$refs.uploadPrice.clearFiles();
      let _this = this;
      let obj = {
        imgUrl: "",
        name: ""
      };
      const testmsg = file.name.substring(file.name.lastIndexOf(".") + 1);
      const isJpgOrPng =
        testmsg === "jpg" ||
        testmsg === "JPG" ||
        testmsg === "png" ||
        testmsg === "PNG" ||
        testmsg === "GIF" ||
        testmsg === "gif";
      let fileListData = [];
      for (let x = 0; x < fileList.length; x++) {
        let item1 = fileList[x];
        if (isJpgOrPng) {
          // 图片才压缩
          this.GLOBAL.compress(item1.raw, async function(val) {
            let newfile = new window.File([val], file.name, {
              type: file.type
            });
            newfile.uid = file.uid;
            fileListData.push(newfile);
            const formData = new FormData();

            formData.append(`img`, fileListData[0]);
            await img(formData).then(res => {
              _this.$set(_this.dailyFinishFiles, "imgUrl", res.data.data);
            });
            setTimeout(() => {
              _this.stats = true;
            }, 100);
          });

          var file = item1.raw;
          obj.name = item1.name;
          var reader = new FileReader();
          reader.onload = function(e) {
            // 转base64
            obj.imgUrl = e.target.result;
          };
          reader.readAsDataURL(file);
        } else {
          this.$message({
            showClose: true,
            message: "请上传图片",
            type: "error"
          });
        }
      }
    },

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在云函数中也可以使用 `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` 等更轻量级的库进行处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值