当前位置: 首页 > news >正文

js压缩图片的方法(手机端,兼容ios和android),返回值为base64的字符串,压缩率ratio可自定义...

方法的定义:

getCompressBase64(img, ratio){//img为通过"document.getElementByTagName('input[type=file]')[0]"拿到的图片blog对象, 压缩率ratio范围为0-1

  if(Object.prototype.toString.call(img) === '[object HTMLInputElement]'){
    let phone = navigator.userAgent.indexOf('iPhone')//获取是否是iphone
    let reader = new FileReader()
    reader.readAsDataURL(img.files[0])
    let tempPromise = new Promise((resolve,reject)=>{
      reader.onload = function(e){
      image = new Image()
      image.src = e.target.result
      image.onload = function () {
        var that = this
        // 默认按比例压缩
        w = that.width
        h = that.height
        scale = w / h
        canvas = document.createElement('canvas')
        if(phone > -1){
          canvas.width = h
          canvas.height = w
          ctx = canvas.getContext('2d')
          ctx.save();
          ctx.translate(h/2,w/2);
          ctx.rotate(90*Math.PI/180)
          ctx.drawImage(image, 0 - w/2, 0 - h/2, w, h)
          ctx.restore()
        }else{
          canvas.width = w
          canvas.height = h
          ctx = canvas.getContext('2d')
          ctx.drawImage(image, 0, 0, w, h)
        }
        img64 = canvas.toDataURL('image/jpeg', ratio)
        resolve(img64)
      }
    }
  })
  return tempPromise//返回一个promise

}

方法的使用:

let img = document.getElementByTagName('input[type=file]')[0]//拿到页面中的某个图片
let file = img.files[0]
// 首先读取此图片,读取完毕之后进行压缩
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = function () {//
  getCompressBase64(img, 0.01).then(data => {
    console.log(data)//data就是压缩后的base64格式的字符串
  })
}

转载于:https://www.cnblogs.com/xuanbingbingo/p/8607969.html

相关文章:

  • DirectFB、Layer、Window、Surface之间关系
  • 复杂recyclerView封装库
  • js文件、图片上传(原生方法和jquery的ajax两种都有)
  • 浮点数网络传输
  • 第199天:js---扩充内置对象功能总结
  • 1.6-1.7 centos7-配置ip
  • Maven学习笔记四(坐标和依赖)
  • java 泛型中classT 和T的区别是什么?
  • django性能优化缓存view详解
  • thymeleaf 引入js css 无效
  • 【JS第13期】变量、作用域、内存等问题
  • 在CentOS6.8下安装Docker
  • Codepen 每日精选(2018-3-25)
  • Laravel核心解读--Facades
  • 学习rsyslog总结
  • 【node学习】协程
  • AngularJS指令开发(1)——参数详解
  • exif信息对照
  • Javascript设计模式学习之Observer(观察者)模式
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Laravel 菜鸟晋级之路
  • Mac转Windows的拯救指南
  • overflow: hidden IE7无效
  • react 代码优化(一) ——事件处理
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 闭包--闭包之tab栏切换(四)
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 记一次删除Git记录中的大文件的过程
  • 码农张的Bug人生 - 初来乍到
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 如何解决微信端直接跳WAP端
  • 双管齐下,VMware的容器新战略
  • 通信类
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 一些css基础学习笔记
  • 硬币翻转问题,区间操作
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • 正则表达式-基础知识Review
  • # 计算机视觉入门
  • # 数论-逆元
  • #14vue3生成表单并跳转到外部地址的方式
  • ()、[]、{}、(())、[[]]命令替换
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (分布式缓存)Redis持久化
  • (转)Google的Objective-C编码规范
  • (转)JAVA中的堆栈
  • (转)Unity3DUnity3D在android下调试
  • .naturalWidth 和naturalHeight属性,
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET微信公众号开发-2.0创建自定义菜单
  • [ C++ ] template 模板进阶 (特化,分离编译)