vue 图片等比例缩放上传

需求:上传图片之前按比例缩小图片分辨率,宽高不超过1920不处理图片,宽高超过1920则缩小图片分辨率,如果是一张图片请参考这篇博客:js实现图片压缩、分辨率等比例缩放
我根据这篇博主的分享,写下了我的循环上传的分辨率等比缩小
功能:点击+号,新增一项,点击- 号 删除一项
在这里插入图片描述
:auto-upload="false" 使用elementUI组件不能使他自动上传,主要功能是上传最左边的图片

 <el-form ref="form" :model="form"  label-width="120px">
 	<el-form-item label="资源列表:">
       <div class="ziyuan" flex v-for="(item, indexes) in  addList " :key="item.idxxx">
           <div style="margin-top: 9px;">
           //图片(主要功能在这里)
               <el-upload :action="domins + '/common/upload'"
                   :class="{ disabled: item.uploadDisabled }" list-type="picture-card"
                   
                   :auto-upload="false"
                   :on-remove="handleRemove.bind(null, { 'index': indexes, 'data': item })"
                  
                   :on-change="handleChange.bind(null, { 'index': indexes, 'data': item })"
                   :file-list="item.fileList" accept="image/png, image/jpeg">
                   <i class="el-icon-plus"></i>
               </el-upload>
               <el-dialog :visible.sync="dialogVisible">
                   <img width="100%" :src="item.dialogImageUrl" alt="">
               </el-dialog>

           </div>
           <div class="yasuo" flex="cross:center">
               <div>
                   <div style="height: 68px;">
                   //压缩包
                       <el-upload ref="uploadzip" :action="domins + '/common/upload'"
                           :before-upload="beforeUploadZip" :on-remove="handleRemoveZip"
                           :on-success="handleAvatarSuccessZip.bind(null, { 'index': indexes, 'data': item })"
                           :file-list="item.fileListZip" :auto-upload="true" accept=".zip ,.mp4"
                           :limit="1">
                           <el-button size="small" type="primary">选择资源包</el-button>
                       </el-upload>
                   </div>
               </div>
           </div>
           <div class="airadio">
               <el-radio-group v-model="item.way" >
                   <el-radio :label="0">Android</el-radio>
                   <el-radio :label="1">ios</el-radio>
                   <el-radio :label="2">视频</el-radio>
               </el-radio-group>
           </div>
           <div style="margin-top: 11px;">
           //  '+'
               <i class="el-icon-circle-plus-outline" style="color: #264E71;"
                   @click="plusOne(indexes)"></i>
                     //  '+'
               <i class="el-icon-remove-outline" style="color: #264E71;" v-show="addList.length > 1"
                 @click="removeOne(indexes, item.id, item)"></i>

           </div>
       </div>
   </el-form-item>
 </el-form>

代码:

<script>
// 等比例缩小图片
function imageScale(width, originWidth, originHeight) {
    const scaleRatio = width / originWidth;
    const scaleHeight = scaleRatio * originHeight;
    return [width, scaleHeight];
}

export default {
    components: {  },
    data() {
        return {
       	 	form: {},
       	 	addList: [{
                id: 0,
                uploadDisabled: false,
                album: '',
                zip: '',
                way: 0,
                idxxx: 0
            }],
        }
    },
    methods:{
    	handleRemove(obj, file, fileList) {
            let index = obj.index;

            this.addList[index].uploadDisabled = false
            this.$forceUpdate()
        },
        // 处理图片
        compress(file, scaleWidth, quality = 0.5) {
            return new Promise((resolve, reject) => {
                const reader = new FileReader();
                console.log(file, 'file----');
                reader.readAsDataURL(file.raw);
                reader.onload = (e) => {
                    let img = new Image();
                    img.src = e.target.result;
                    img.onload = function () {
                        // 等比例缩放图片
                        const [width, height] = imageScale(
                            scaleWidth,
                            img.width,
                            img.height
                        );
                        let canvas = document.createElement("canvas");
                        img.width = canvas.width = width;
                        img.height = canvas.height = height;
                        let ctx = canvas.getContext("2d");
                        ctx.drawImage(img, 0, 0, img.width, img.height);
                        canvas.toBlob(
                            (blob) => {
                                resolve(blob);
                            },
                            "image/jpeg",
                            quality
                        );
                    };

                    img.onerror = function () {
                        reject();
                    };
                };
            });
        },
        handleChange(obj, file, fileList) {
            console.log(file, fileList, 'file, fileList识别图路径');
            if (fileList.length >= 1) {
                let reader = new FileReader()
                reader.readAsDataURL(file.raw) // 必须用file.raw
                reader.onload = () => {
                
                    let img = new Image()
                    img.src = reader.result

                    img.onload = () => {
                        console.log(img.width, 'img.width');
                        console.log(img.height, 'img.height');
                        // 宽高超过1920则缩小图片分辨率
                        if (img.width > 1920 || img.width == 1920 || img.height > 1920 || img.height == 1920) {
                            this.compress(file, 1024).then((blob) => {
                            // 根据后端的要求传数据,如果要求是blob,则不需要处理数据,我这边需求是上传file文件流
                            //处理成file文件流 

                                let f = new File([blob], 'image.jpg', { type: 'image/jpeg' })
                                var form = {};
                                form = new FormData();
                                form.append('file', f);
                                this.$axios.post(this.domins + '/common/upload', form).then((res) => {

                                    let index = obj.index;

                                    this.addList[index].uploadDisabled = true
                                    this.addList[index].album = res.data.data.fullurl
                                    console.log(this.addList, '==addList==');
                                })
                            });
                        } else {
							//宽高不超过1920不处理图片
                            let form = {};
                            form = new FormData();
                            // form 需要的是el-upload 中的file.row
                            form.append('file', file.raw);

                            this.$axios.post(this.domins + '/common/upload', form).then((res) => {
                                let index = obj.index;
                                this.addList[index].uploadDisabled = true
                                this.addList[index].album = res.data.data.fullurl
                                console.log(this.addList, '==addList=3333=');
                            })
                        }
                    }
                }

            }


        },
    }
}
</script>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/243683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之开篇

在软件开发的世界里&#xff0c;设计模式有如一本精妙的工程艺术指导准则&#xff0c;为我们提供了解决常见问题的优雅实现方案。然而&#xff0c;有些程序员可能会认为设计模式太过繁琐&#xff0c;一个简单的 if/else 语句就能解决问题&#xff0c;何必费心去学习这些看似复杂…

JVM对象创建与内存分配机制分析

对象的创建 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加…

易基因:动脉粥样硬化中的DNA甲基化和组蛋白修饰及其表观遗传治疗视角|综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 动脉粥样硬化&#xff08;Atherosclerosis, as&#xff09;是一种以动脉血管壁炎症和斑块积聚为特征的血管病变&#xff0c;是大多数心血管疾病的重要病因。除了脂质沉积和慢性炎症外&am…

Python开发工具PyCharm v2023.3全新发布——全面推出AI Assistant工具

JetBrains PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 PyCharm v2023.3正式版下载 在 PyCharm 2023.3 中&#xff0c;每…

1-3算法基础-标准模板库STL

1.pair pair用于存储两个不同类型的值&#xff08;元素&#xff09;作为一个单元。它通常用于将两个值捆绑在一起&#xff0c;以便一起传递或返回。 #include <iostream> #include <utility> using namespace std; int main() {pair<int, string> person m…

速卖通(AliExpress)店铺流量怎么转化?自养号测评策略

随着全球电商的蓬勃发展&#xff0c;速卖通&#xff08;AliExpress&#xff09;作为中国领先的跨境电商平台&#xff0c;为卖家提供了一个广阔的销售舞台。然而&#xff0c;对于卖家来说&#xff0c;如何让速卖通店铺实现转化&#xff0c;吸引更多的买家成为关键。 一、速卖通…

PADS的使用

目录 一、PADS常规操作1.1 常用快捷键1.2 Logic相关设置 二、Logic库操作2.1 逻辑库2.2 封装库2.3 元件库 一、PADS常规操作 PADS安装好了之后&#xff0c;主要使用下面三个软件&#xff1a; Logic&#xff1a;画原理图文件&#xff0c;也可以使用OrCAD导入Router&#xff1a;…

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】 目录 分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现DBO-SVM蜣螂算法优化支持向量机的…

让测试效率起飞的8款浏览器兼容性测试工具,你get了吗?

浏览器的兼容性问题&#xff0c;是指不同浏览器使用内核及所支持的 HTML 等网页语言标准不同&#xff0c;用户客户端的环境不同造成的显示效果不能达到理想效果。 对于用户而言&#xff0c;无论使用哪款浏览器&#xff0c;期望看到的效果是正常的统一的。市面上发布的浏览器版…

什么是代码签名证书

代码签名证书是一种用于验证软件开发者身份并确保软件完整性的数字证书。在如今数字化的世界中&#xff0c;代码签名证书扮演着至关重要的角色。它们不仅为软件开发者提供了一种方式来证明其身份&#xff0c;还有助于保护用户免受恶意软件和未经授权的软件更改的侵害。 首先&am…

maui 调用文心一言开发的聊天APP 3

主要是对代码进行了优化 上一个版本写死了帐号跟密码 &#xff0c;这一个帐本有户可以直接设置对相关的key以及secret如果设置错时&#xff0c;在聊天中也会返回提示。注册帐号时同时也设置了key及secrete升级到了net.8.0导出APK&#xff0c;上一个版本是导出abb.解决了变型问…

动物姿态估计:微调 YOLOv8 姿态模型

动物姿态估计是计算机视觉的一个研究领域&#xff0c;是人工智能的一个子领域&#xff0c;专注于自动检测和分析图像或视频片段中动物的姿势和位置。目标是确定一种或多种动物的身体部位&#xff08;例如头部、四肢和尾巴&#xff09;的空间排列。这项技术具有广泛的应用&#…

一起学习生成式人工智能(四)|用低代码实现人工智能应用

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

EasyRecovery(数据恢复软件) 2024中文绿色无需激活版下载

EasyRecovery是一款功能强大且专业的数据恢复软件&#xff0c;软件能够对电脑误删的文件进行恢复&#xff0c;包括格式化硬盘是数据恢复、手机U盘数据恢复等&#xff0c;小编今天给大家带来的是根据官软件解压后直接使用。感兴趣的朋友快来下载使用吧。 EasyRecovery-2024mac最…

Java数据结构篇——实现顺序表的增删查改

文章目录 1.线性表2. 顺序表2.1 顺序表结构2.2 实现顺序表接口2.3 打印顺序表2.2 实现新增元素2.3 实现查找元素2.3 获取pos位置的值2.4 删除元素2.5 获取顺序表的长度2.6 清空顺序表 3.代码在这 1.线性表 定义&#xff1a;线性表是 n 个具有相同特性的数据元素的有序序列。线…

数据库性能优化八大方案

毫不夸张的说咱们后端工程师&#xff0c;无论在哪家公司&#xff0c;呆在哪个团队&#xff0c;做哪个系统&#xff0c;遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论&#xff0c;能让大家快速、准确的去选择出合适的优化方案&#xff0c;我相信…

Unity之OpenXR+XR Interaction Toolkit接入Meta Quest3

前言 随着备受期待的Meta Quest 3与今年10月10日发布,这款来自Meta的下一代VR游戏头戴设备承诺将彻底改变您的游戏方式。 Meta Quest 3,玩家只需轻松一触即可在虚拟现实和真实世界之间无缝切换,无需摘下头戴设备进行快速现实检查。 Meta Quest 3最引人注目的特点之一是其能…

【知识积累】深度度量学习综述

原文指路&#xff1a;https://hav4ik.github.io/articles/deep-metric-learning-survey Problem Setting of Supervised Metric Learning 深度度量学习是一组旨在衡量数据样本之间相似性的技术。 Contrastive Approaches 对比方法的主要思想是设计一个损失函数&#xff0c;直…

pytorch中的归一化:BatchNorm、LayerNorm 和 GroupNorm

1 归一化概述 训练深度神经网络是一项具有挑战性的任务。 多年来&#xff0c;研究人员提出了不同的方法来加速和稳定学习过程。 归一化是一种被证明在这方面非常有效的技术。 1.1 为什么要归一化 数据的归一化操作是数据处理的一项基础性工作&#xff0c;在一些实际问题中&am…

六.聚合函数

聚合函数 1.什么是聚合函数1.1AVG和SUM函数1.2MIN和MAX函数1.3COUNT函数 2.GROUP BY2.1基本使用2.2使用多个列分组2.3GROUP BY中使用WITH ROLLUP 3.HAVING3.1基本使用3.2WHERE和HAVING的区别 4.SELECT的执行过程4.1查询的结构4.2SELECT执行顺序4.3SQL执行原理 1.什么是聚合函数…