使用canvas压缩图片

canvas的toDataUrl方法可以将内容导出为base64编码格式的图片,采用base64编码将比源文件大1/3,但是该方法可以指定导出图片质量,所以前端可实现上传图片的压缩。先通过fileApi拿到本地图片地址,然后新建一个Img元素,图片绘制到canvas中后再将其导出(压缩)。例如:


$( ':file' ).on( 'change' , function (){
         var  file =  this .files[0];
         var  url = webkitURL.createObjectURL(file);
  
         /* 生成图片
         * ---------------------- */
         var  $img =  new  Image();
         $img.onload =  function () {
  
             //生成比例
             var  width = $img.width,
                     height = $img.height,
                     scale = width / height;
             width = parseInt(800);
             height = parseInt(width / scale);
  
             //生成canvas
             var  $canvas = $( '#canvas' );
             var  ctx = $canvas[0].getContext( '2d' );
             $canvas.attr({width : width, height : height});
             ctx.drawImage($img, 0, 0, width, height);
             var  base64 = $canvas[0].toDataURL( 'image/jpeg' ,0.5);
  
             //发送到服务端
             $.post( 'upload.php' ,{formFile : base64.substr(22) }, function (data){
                 $( '#php' ).html(data);
             });
  
         }
         $img.src = url;
  
     });

此方法存在一些问题:

  1.在ios上当图片过大时图片会被压扁

  2.在android上无法指定压缩质量

  3.图片通过fileApi读取进来,竖着拍的图片会横置


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值