最近在做一个政务类的移动端H5项目,用户体量达百万级别,有一个模块中有上传图片反馈的功能,由于各个手机产商拍照的像素值的都不一样,后台去浏览这个图片的时候就出现大小不一的情况,另外有些图片并不需要上传原始尺寸,再加上大流量的情况下就造成了服务器资源不必要的浪费,于是就有了将上传图片压缩的需求

图像压缩原理
图像压缩有两种方式,目前写的方法是两者都支持且能够共同处理
1.图像尺寸裁剪,由大变小
2.尺寸不变,图片质量缩减

引用代码

if (!HTMLCanvasElement.prototype.toBlob) {Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {value: function(callback, type, quality) {var canvas = thissetTimeout(() => {var binStr = atob(canvas.toDataURL(type, quality).split(',')[1])var len = binStr.lengthvar arr = new Uint8Array(len)for (var i = 0; i < len; i++) {arr[i] = binStr.charCodeAt(i)}callback(new Blob([arr], { type: type || 'image/png' }))})}})
}
const compressionImage = ({ content, maxWidth = 2000, maxHeight = 2000, quality = 1 }) => {return new Promise(resolve => {const set = (fileContent, fileType, fileName) => {const canvasDOM = document.createElement('canvas')const canvasContext = canvasDOM.getContext('2d')const img = new Image()img.src = fileContentimg.onload = () => {let targetWidthlet targetHeightif (img.width > maxWidth && img.height > maxHeight) {const rate = Math.min(maxWidth / img.width, maxHeight / img.height)targetWidth = img.width * ratetargetHeight = img.height * rate} else if (img.width > maxWidth) {targetWidth = maxWidthtargetHeight = (maxWidth / img.width) * img.height} else if (img.height > maxHeight) {targetHeight = maxHeighttargetWidth = (maxHeight / img.height) * img.width} else {targetWidth = img.widthtargetHeight = img.height}canvasDOM.width = targetWidthcanvasDOM.height = targetHeightcanvasContext.drawImage(img, 0, 0, img.width, img.height, 0, 0, targetWidth, targetHeight)const url = canvasDOM.toDataURL(fileType, quality)const callback = blob => {resolve({ url, blob })}canvasDOM.toBlob(callback, fileType, quality)}}if (content instanceof File) {const fileReader = new FileReader()fileReader.readAsDataURL(content)fileReader.onload = e => {set(e.target.result, content.type, content.name)}} else if (typeof content === 'string') {const fileType =content.includes('data:image/png;base64') ? 'image/png': content.includes('data:image/gif;base64') ? 'image/gif' : 'image/jpeg'set(content, fileType, `file-${+new Date()}`)}})
}

调用方式

const { url, blob } = await compressionImage({content: 'base64', //图像base64或file文件maxWidth: 1000, //最大宽度maxHeight: 600, //最大高度quality: 0.7 //图像质量,1为100%,建议选值0.95以下,1输出后的图像较大
})
console.log('压缩后的base64内容', url)
console.log('压缩后的blob文件', blob)

结果查看
对图片的尺寸和质量都进行了压缩,原始图像306b,压缩后的图像86kb



JS利用Canvas实现图片等比例裁剪、压缩相关推荐

  1. js 利用canvas转换图片格式并下载图片

    1.利用canvas转换格式 思路很简单,就是在canvas上drawImage,然后再把canvas转换成想要的图片格式 convertImageToCanvas = (image) => { ...

  2. html验证码图片,js+h5 canvas实现图片验证码

    本文实例为大家分享了js+h5 canvas实现图片验证码的具体代码,供大家参考,具体内容如下 实现效果 一.使用技术 原生js技术+html5 canvas画图 利用Math.random()函数随 ...

  3. 利用canvas下载图片,透明区默认变为黑色

    问题:利用canvas下载图片,透明区默认变为黑色 HTML <canvas id="canvas"></canvas> <div style=&qu ...

  4. uni-app 图片固定比例裁剪

    官方demo里有图片自由比例裁剪的功能 ,所以这里直接拿来用 <template><view class="container"><view clas ...

  5. php图片素描化,html5利用canvas实现图片转素描效果

    本章给大家介绍html5如何利用canvas实现图片转素描效果.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 素描滤镜原理: 最基础的算法就是: 1.去色:(去色公式:gray = ...

  6. vue.js 利用canvas绘制仪表盘圆环进度条-带动画

    vue.js 利用canvas绘制简易仪表盘进度条 html代码 因为动画效果比较消耗性能,所以进度条单独canvas绘制 <template><div class="ci ...

  7. JS使用canvas给图片打马赛克

    简介 利用canvas加载图片后,画布上的各像素的颜色(r,g,b)值来填充色块,达到马赛克效果. 效果图 代码 html <canvas id="canvas" data- ...

  8. JS实现Canvas中图片淡出效果_艾孜尔江撰

    <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>实现C ...

  9. 利用js结合canvas给图片打马赛克

    效果演示 什么是canvas? <canvas> 元素用于图形的绘制,只是图形容器. 元素本身并没有绘制能力,您必须使用js脚本来绘制图形. getContext() 方法可返回一个对象, ...

最新文章

  1. java二级下拉菜单_航菜单栏中的二级下拉菜单
  2. [转]Android UI 自动化测试
  3. SNMPM 配置 [linux windows solaris]
  4. 考研英语一2011年翻译真题详解
  5. 计算两个NSDate是否处于同一天
  6. JSK-390 计负均正【入门】
  7. [R语言绘图]气泡图symbols
  8. x86 vt-d在linux中的应用
  9. 泛微E9 获取附件内容,泛微Ecology9获取附件范例,Ecology9附件、E9 附件下载及上传集成平台
  10. mindoc mysql_MinDoc 配置文件详解
  11. 网站域名https显示证书错误如何解决
  12. 【UI设计No9】VI
  13. 教你几个Excel常用的数据分析技巧!
  14. 防止暴利破解,拒绝ip登陆
  15. #535. 「NOIP2018」填数游戏
  16. 考研期间复习时间记录
  17. 比价寄快递CPS小程序开发
  18. Day 01嵌入式学习之Linux基础知识和命令操作
  19. cocos cretor shader effect-the book of shader前言
  20. 接口能通但是没有数据_直接用大脑联网刷微博看电影看小说!脑机接口最新专利详解...

热门文章

  1. Google入门到精通(搜索方法经典)
  2. access查找楼号为01_Access 应用基础—查询设计(一)
  3. 【论文阅读】GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition
  4. 使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码
  5. 企业如何选择靠谱的加密软件?
  6. WHIA2023武汉国际工业自动化展览会
  7. 沃利斯圆周率用c语言,沃利斯圆周率计算公式!
  8. A - Cthulhu CodeForces - 103B (并查集)
  9. 天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能
  10. 第十六周 项目1 验证算法 堆排序