vue、js实现图片等比压缩,等比缩放完整demo

简介: vue、js实现图片等比压缩,等比缩放完整demo
<!DOCTYPE>
<html>
    <head>
      <meta name="baidu-site-verification" content="LDyoKvyTEK" />
        <link rel="shortcut icon " type="images/x-icon" href="img/gt.ico">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>图片等比处理</title>
    <style type="text/css">
      img {
        width: 300px;
        height: auto;
      }
    </style>
    </head>
    <body class="base-transition">
        <div class="page-wrap homepage" id="vue" v-cloak>
      <p>选择的图片任意一边大于1024,以最长边等比压缩图片,否则不处理</p>
      <input id="photo" type="file" accept="image/png,image/jpeg,image/jpg" @change="handkeFileChange($event)" />
      <h4>
        <span>选择图片长:<span>{{sw}}px</span>&nbsp;&nbsp;&nbsp;&nbsp;宽:<span>{{sh}}px</span></span>
        <br />
        <span>处理后图片长:<span>{{rw}}px</span>&nbsp;&nbsp;&nbsp;&nbsp;宽:<span>{{rh}}px</span></span>
      </h4>
      <img :src="usableImage" />
        </div>
        <script type="text/javascript" src="js/vue.min.js" ></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue"></script>
        <script>
      var vue = new Vue({
        el: '#vue',
        data: {
          usableImage: '',
          sw: 0,
          sh: 0,
          rw: 0,
          rh: 0
        },
        computed: {},
        watch: {},
        mounted: function() {},
        methods: {
          handkeFileChange: function(event) {
            let that = this;
            that.gate = false;
            let file = event.target.files[0];
            let reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onload = function(event) {
              that.imageSrc = event.target.result;
              //加载图片获取图片真实宽度和高度
              let image = new Image();
              image.onload = function() {
                let width = image.width;
                that.sw = width;
                let height = image.height;
                that.sh = height;
                if(width > 1024 && width > height) {
                  that.dealImage(that.imageSrc, {
                    width: 1024,
                    quality: 1
                  }, function(base) {
                    that.usableImage = base;
                  })
                } else if(height > 1024 && height > width) {
                  that.dealImage(that.imageSrc, {
                    height: 1024,
                    quality: 1
                  }, function(base) {
                    that.usableImage = base;
                  })
                } else {
                  that.rw = width;
                  that.rh = height;
                  that.usableImage = that.imageSrc;
                }
              }
              image.src = that.imageSrc;
            }
          },
          /**
           * 图片压缩,默认同比例压缩
           * @param {Object} path 
           *   pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径
           * @param {Object} obj
           *   obj 对象 有 width, height, quality(0-1)
           * @param {Object} callback
           *   回调函数有一个参数,base64的字符串数据
           */
          dealImage: function(path, obj, callback) {
            let ts = this;
            var img = new Image();
            img.src = path;
            img.onload = function() {
              var that = this;
              // 默认按比例压缩
              var w = that.width,
                h = that.height,
                scale = w / h;
              w = obj.width || (obj.height * scale);
              h = obj.height || (obj.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;
              ts.rw = w;
              var anh = document.createAttribute("height");
              anh.nodeValue = h;
              ts.rh = h;
              canvas.setAttributeNode(anw);
              canvas.setAttributeNode(anh);
              ctx.drawImage(that, 0, 0, w, h);
              // 图像质量
              if(obj.quality && obj.quality <= 1 && obj.quality > 0) {
                quality = obj.quality;
              }
              // quality值越小,所绘制出的图像越模糊
              var base64 = canvas.toDataURL('image/jpeg', quality);
              // 回调函数返回base64的值
              callback(base64);
            }
          }
        }
      });
    </script>
    </body>
</html>
目录
相关文章
|
2月前
|
JavaScript 前端开发 开发者
VUE 开发——Node.js学习(一)
VUE 开发——Node.js学习(一)
91 3
|
7天前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
1月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
41 4
|
1月前
|
JavaScript 前端开发 开发者
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
37 0
|
3月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
2月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
200 0
|
2月前
|
JavaScript
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
58 0
|
2月前
|
JavaScript 前端开发
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
|
7月前
|
JavaScript API
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
80 3
|
7月前
|
人工智能 JavaScript 前端开发
毕设项目-基于Springboot和Vue实现蛋糕商城系统(三)
毕设项目-基于Springboot和Vue实现蛋糕商城系统