zoukankan      html  css  js  c++  java
  • js/vue图片压缩

    js版

    1. 新建compressImage.js,内容如下:
    // 将base64转换为blob(有需要可加上,没需要可不加)
    function convertBase64UrlToBlob(urlData) {
      var arr = urlData.split(',')
      var mime = arr[0].match(/:(.*?);/)[1]
      var bstr = atob(arr[1])
      var n = bstr.length
      var u8arr = new Uint8Array(n)
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
      }
      return new Blob([u8arr], { type: mime })
    }
    
    // 压缩图片
    function compressImage(path, config, callback) {
      var img = new Image()
      img.src = path
      img.onload = function() {
        var that = this
        var w = that.width
        var h = that.height
        var scale = w / h
        w = config.width || (config.height * scale)
        h = config.height || (config.width / scale)
        var quality = 0.7 // 默认图片质量为0.7
        // 生成canvas
        var canvas = document.createElement('canvas')
        var ctx = canvas.getContext('2d')
        // 创建属性节点
        var anw = document.createAttribute("width")
        anw.nodeValue = w
        var anh = document.createAttribute("height")
        anh.nodeValue = h
        canvas.setAttributeNode(anw)
        canvas.setAttributeNode(anh)
        ctx.drawImage(that, 0, 0, w, h)
        if (config.quality && config.quality <= 1 && config.quality > 0) {
          quality = config.quality
        }
        var base64 = canvas.toDataURL('image/*', quality)
        // 回调函数返回blob的值(若不需要,可直接返回base64的值)
        callback(convertBase64UrlToBlob(base64))
      }
    }
    
    1. 在html文件中引入
    <script src="./compressImage.js"></script> // 具体路径按自己存放的位置而定
    
    1. 使用:
    compressImage(图片路径, {
       100, // 压缩后图片的宽
      height: 200, // 压缩后图片的高,宽高若只传一个,则按图片原比例进行压缩
      quality: 0.8 // 压缩后图片的清晰度,取值0-1,不传默认为0.7,值越小,所绘制出的图像越模糊
    }, function(result){
      console.log(result) // result即为压缩后的结果
    })
    

    vue版

    1. 新建compressImage.js,内容如下:
    // 将base64转换为blob
    export function convertBase64UrlToBlob(urlData) {
      var arr = urlData.split(',')
      var mime = arr[0].match(/:(.*?);/)[1]
      var bstr = atob(arr[1])
      var n = bstr.length
      var u8arr = new Uint8Array(n)
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
      }
      return new Blob([u8arr], { type: mime })
    }
    
    // 压缩图片
    export function compressImage(path, config) {
      return new Promise((resolve, reject) => {
        var img = new Image()
        img.src = path
        img.onload = function() {
          var that = this
          var w = that.width
          var h = that.height
          var scale = w / h
          w = config.width || config.height * scale
          h = config.height || config.width / scale
          var quality = 0.7 // 默认图片质量为0.7
          // 生成canvas
          var canvas = document.createElement('canvas')
          var ctx = canvas.getContext('2d')
          // 创建属性节点
          var anw = document.createAttribute('width')
          anw.nodeValue = w
          var anh = document.createAttribute('height')
          anh.nodeValue = h
          canvas.setAttributeNode(anw)
          canvas.setAttributeNode(anh)
          ctx.drawImage(that, 0, 0, w, h)
          if (config.quality && config.quality <= 1 && config.quality > 0) {
            quality = config.quality
          }
          var base64 = canvas.toDataURL('image/*', quality)
          // var blob = convertBase64UrlToBlob(base64)
          // 回调函数返回base64的值,也可根据自己的需求返回blob的值
          resolve(base64)
        }
      })
    }
    
    1. 在vue文件中引入
    import { compressImage } from './compressImage' // 具体路径按自己存放的位置而定
    
    1. 使用:
    compressImage(图片路径, {
       100, // 压缩后图片的宽
      height: 200, // 压缩后图片的高,宽高若只传一个,则按图片原比例进行压缩
      quality: 0.8 // 压缩后图片的清晰度,取值0-1,不传默认为0.7,值越小,所绘制出的图像越模糊
    }).then(result => {
      console.log(result) // result即为压缩后的结果
    })
    

    关于图片压缩后失真的修复可查看 vue图片压缩(不失真)

  • 相关阅读:
    电子商务标准体系RosettaNet与Microsoft BizTalk Accelerator for RosettaNet 无为而为
    sharepoint进行Unit Test的一个方案 无为而为
    微软VSTS的新功能:WebTest要点 无为而为
    IT部门的几种生存模式分析 无为而为
    一个人出现问题可能是道德问题,但是很多人都有相同的问题就一定不是道德问题。 无为而为
    意大利人有过关了,不过要面对东道主德国队未必会有这么容易 无为而为
    记一次阿里云OSS的STS授权访问
    得到应用程序所在路径
    反射 运用
    GetEnumerator用法
  • 原文地址:https://www.cnblogs.com/shifeng-/p/10448960.html
Copyright © 2011-2022 走看看