compress-image-canvas

通过canvas纯前端裁剪压缩图片


Keywords
canvas, 纯前端裁剪压缩图片
License
MIT
Install
npm install compress-image-canvas@0.0.2

Documentation

compressImages 纯前端通过canvas api 裁剪压缩图片

使用方法:

interface IsizeType {
    targetW?: number 需裁剪到的目标宽
    targetH?: number 需裁剪到的目标搞
    scale?: number 缩放==> 缩放到指定宽度,高度自适应 和上面两项互斥,上面两项成对出现,
}

// cdn 地址引用 https://unpkg.com/compress-image-canvas@latest/dist/compress-image-canvas.min.js
import CompressImage from "compress-image-canvas";

// 使用示例
/**
 * file 经过input上传后拿到的图片文件
 * obj  所需裁剪到的尺寸
 * type 裁剪压缩后的图片格式,默认以原图片文件格式为准,若指定则以指定类型为准
*/
const cImage = new CompressImage(file, obj: IsizeType, type)
const res = await cImage.getCompressImage(me.file)

/**
 *  返回格式
 *  base64: base64图片 
 *  blob: Blob {size: 4982, type: "image/png"}
 *  height: 33.3822091886608
 *  width: "50"
*/
  • 基本原理
  图片自动裁剪·压缩
  默认目标尺寸 1280*800
  
  如图片尺寸大于上述尺寸则按比例压缩并居中裁剪
  如图片小于目标尺寸则保持现有尺寸不做处理
  • canvas 处理原理
  分成两种情况计算canvas及图片尺寸的原因
  
  1. 当图片某一边或两边都小于目标宽高
     这种情况不需要对图片进行缩放,直接用 drawImage 九参数 直接在画布上进行裁剪
  
  2. 图片宽高均大于 目标宽高尺寸 
     受限于 drawImage 九参数时只可以在图片原始尺寸上裁剪,不可在缩放后的尺寸上裁剪
  
     若非要使用 drawImage 九参数就需要创建一个和图片原始尺寸等大的canvas画布,这样有可能绘制的canvas尺寸特别大,因而产生性能问题
  
     故采用第二种方案
     drawImage 五参数将图片缩放放在画布内,然后用 clip 裁剪,getImageData ==> putImageData 绘制在新画布内 
  • 压缩即通过 canvas.toDataURL()