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>
目录
相关文章
|
6天前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
6天前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
11天前
|
JavaScript 前端开发
JS配合CSS3实现动画和拖动小星星小Demo
本文通过代码示例展示了如何使用JavaScript和CSS3实现动画效果和拖动小星星的交互效果,包括文字掉落动画和鼠标拖动产生小星星动画的实现方法。
24 0
JS配合CSS3实现动画和拖动小星星小Demo
|
22天前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
64 5
|
2月前
|
容器
Vue3图片(Image)
该图片预览组件提供丰富的功能,包括设置鼠标悬浮预览文本、图像描述、尺寸调整、适应容器模式等。支持单张或多张图片展示,具备旋转、缩放、镜像等功能,并可通过键盘或滚轮控制。组件允许自定义多项属性,如图像地址、宽度、高度、边框显示等,并兼容多种使用场景,如相册模式和循环切换。组件内部使用了 Vue3 的 `Spin` 和 `Space` 组件以及 `add` 函数辅助实现。
Vue3图片(Image)
|
22天前
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
36 3
|
2月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
18 3
|
2月前
|
JavaScript 前端开发 安全
svg图片hover变色,居然只用一个vue指令就可以搞定!千万别在写两个控制显影了!
【8月更文挑战第22天】svg图片hover变色,居然只用一个vue指令就可以搞定!千万别在写两个控制显影了!
171 3
|
2月前
|
JavaScript 前端开发 测试技术
Vue.js开发者必看!Vue Test Utils携手端到端测试,打造无懈可击的应用体验,引领前端测试新风尚!
【8月更文挑战第30天】随着Vue.js的普及,构建可靠的Vue应用至关重要。测试不仅能确保应用质量,还能提升开发效率。Vue Test Utils作为官方测试库,方便进行单元测试,而结合端到端(E2E)测试,则能构建全面的测试体系,保障应用稳定性。本文将带你深入了解如何使用Vue Test Utils进行单元测试,通过具体示例展示如何测试组件行为;并通过Cypress进行E2E测试,确保整个应用流程的正确性。无论是单元测试还是E2E测试,都能显著提高Vue应用的质量,让你更加自信地交付高质量的应用。
45 0
|
2月前
|
JavaScript 前端开发 UED
揭秘Vue.js高效开发:Vue Router如何让单页面应用路由管理变得如此简单?
【8月更文挑战第30天】随着Web应用复杂性的增加,单页面应用(SPA)因出色的用户体验和高效的页面加载性能而备受青睐。Vue.js凭借简洁的语法和灵活的组件系统成为构建SPA的热门选择,其官方路由管理器Vue Router则简化了路由管理。本文通过实战示例介绍如何利用Vue Router实现高效的SPA路由管理,包括命名路由、动态路由及其核心优势。
20 0