Vue3(setup)中使用vue-cropper图片上传裁剪插件,复制代码直接使用

最近在项目中用到上传裁剪,看了一下代码,觉得这插件可可以。梳理了一下代码分享给大家

前端UI组件element-plus

如果你也用到了 ,快速帮你解决了问题,别忘记点赞收藏

1.首先看效果图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 因为版本vue-cropper 众多 ,虽然网上有各种写法 为了保证能运行 直接copy代码就能用
  2. 直接在package.json中添加依赖 "vue-cropper": "^1.0.9",
  3. 在这里插入图片描述
    然后安装依赖npm install

5 创建一个公用组件

imgcropper.vue

<template><el-dialogv-model="isModel"title="裁剪图片"width="1000px"destroy-on-closecenterdraggable><div class="main"><div class="tip"><div class="tip-text">上传说明"vue-cropper": "^1.0.9"版本</div></div><el-row :gutter="20"><el-col span="14"><div class="mainbox"><vue-cropperref="cropper":img="option.img":outputSize="option.outputSize":outputType="option.outputType":info="option.info":canScale="option.canScale":autoCrop="option.autoCrop":autoCropWidth="option.autoCropWidth":autoCropHeight="option.autoCropHeight":fixed="option.fixed":fixedNumber="option.fixedNumber":full="option.full":fixedBox="option.fixedBox":canMove="option.canMove":canMoveBox="option.canMoveBox":original="option.original":centerBox="option.centerBox":height="option.height":infoTrue="option.infoTrue":maxImgSize="option.maxImgSize":enlarge="option.enlarge":mode="option.mode"@realTime="realTime"></vue-cropper><div class="main-btn"><el-button  size="sm" @click="rotateLeft">↺ 向左旋转15°</el-button><el-button  size="sm" @click="rotateRight">↻ 向左旋转15°</el-button><el-button  size="sm" @click="changeScale(1)"><el-icon type="elui-icon-add-circle" color="#fff"></el-icon>+ 放大</el-button><el-button  size="sm" @click="changeScale(-1)" >- 缩小</el-button ><el-button type="danger" size="sm" @click="changeReset"  >重置</el-button ></div></div></el-col><el-col span="10"><div class="preview-model"><div class="preview" style="width: 200px; height: 200px" v-if="previews.url"><el-imagelazystyle="width: 100px; height: 100px":src="previews.url":zoom-rate="1.2":max-scale="7":min-scale="0.2":preview-src-list="srcList":initial-index="4"@load="lookImg"/></div><div class="upload-btn"><el-upload v-model="file"  :on-change="selectImg"><el-button type="primary" size="sm">选择图片</el-button></el-upload><el-button type="success" style="margin-left: 10px;" size="sm" @click="uploadFile">确认上传</el-button></div></div></el-col></el-row></div></el-dialog></template>
<script setup>
import { ref, reactive ,watch,defineExpose} from "vue";
import { VueCropper } from "vue-cropper";import "vue-cropper/dist/index.css";
const isModel = ref(false);
const name = ref();
const file = ref();
const previews = ref({});
const previewImg = ref();
const cropper = ref(null);
const emit = defineEmits([""]);const option = reactive({img: "",name: "",outputSize: 1, //裁剪生成图片的质量(可选0.1 - 1)outputType: "png", //裁剪生成图片的格式(jpeg || png || webp)info: true, //图片大小信息canScale: true, //图片是否允许滚轮缩放autoCrop: true, //是否默认生成截图框autoCropWidth: 200, //默认生成截图框宽度autoCropHeight: 200, //默认生成截图框高度fixed: false, //是否开启截图框宽高固定比例fixedNumber: [1.53, 1], //截图框的宽高比例full: false, //false按原比例裁切图片,不失真fixedBox: false, //固定截图框大小,不允许改变canMove: true, //上传图片是否可以移动canMoveBox: true, //截图框能否拖动original: false, //上传图片按照原始比例渲染centerBox: true, //截图框是否被限制在图片里面height: false, //是否按照设备的dpr 输出等比例图片infoTrue: false, //true为展示真实输出图片宽高,false展示看到的截图框宽高maxImgSize: 3000, //限制图片最大宽度和高度enlarge: 1, //图片根据截图框输出比例倍数mode: "100% 100%", //图片默认渲染方式
});//预览
const srcList = ref([])//当再次打开时 清空图片
watch(isModel, (val) => {if (!val) {previews.value = {};option.img = ''srcList.value = []}
});//实时预览
const realTime = (data) => {previews.value = data;option.autoCropWidth = data.img.width;option.autoCropHeight = data.img.height;
};//图片缩放
const changeScale = (num) => {num = num || 1;cropper.value.changeScale(num);
};// 向左旋转
const rotateLeft = () => {cropper.value.rotate = cropper.value.rotate - 15 / 90;//直接旋转90度cropper.value.rotateLeft()
};//向右旋转
const rotateRight = () => {cropper.value.rotate = cropper.value.rotate + 15 / 90;//直接旋转90度// cropper.value.rotateRight()
};// 重置
const changeReset = () => {cropper.value.refresh();
};//图片预览图片
const lookImg = () => {cropper.value.getCropBlob((data) => {file.value = data;let img = window.URL.createObjectURL(data);srcList.value.push(img)});
};//选择图片
const selectImg = (e) => {//这里需要注意 每个UI组件 返回的数据格式不一样   需要什么取什么srcList.value = [];option.img = URL.createObjectURL(e.raw);option.name = e.raw.name;};/*** @function 确认上传** */
const uploadFile = () => {cropper.value.getCropBlob((data) => {if (data) {data.fileName = option.name;}emit("uploadImgSuccess", data);});
};/*** @function 开启弹窗* */
const open = () => {isModel.value = true;
};/*** @function 关闭* */
const close = () => {isModel.value = false;
};defineExpose({open,close,
});
</script>
<style lang="scss" scoped>
.main {box-sizing: border-box;min-height: 450px;padding: 20px;.tip {display: flex;align-items: center;margin-bottom: 20px;.tip-text {color: red;}}.mainbox {width: 100%;height: 300px;}.preview-model {display: flex;flex-direction: column;justify-content: flex-start;align-items: center;.preview {overflow: hidden;}.upload-btn {display: flex;width: 100%;justify-content: space-evenly;margin-top: 20px;}}.main-btn {display: flex;justify-content: center;margin-top: 20px;}
}</style>

直接在页面中使用 例如index.vue

index.vue 
<template><div class='content'><el-button type="danger" @click="addimg">上传图片 </el-button><img v-if="imgurl" :src="imgurl" alt="" width='200' height="100"><comCutimgcropper   ref="imgref"    @uploadImgSuccess="uploadImgSuccess"  ></comCutimgcropper></div>
</template><script setup>
import comCutimgcropper from '../components/imgcropper.vue'
import { ref ,watch} from 'vue'
import {useRoute, useRouter} from 'vue-router'
const router = useRouter();
const imgref = ref(null);
const imgurl = ref("");const addimg = () => {imgref.value.open();
}const uploadImgSuccess = data => {//调用接口// uploadImage(data)//这里为了展示 直接 写死一张图片 关闭弹框imgurl.value = "https://img2.baidu.com/it/u=3354585195,1512541150&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1700845200&t=636a3f6d0f2d46b6753a203f48801a98"imgref.value.close()}
const uploadImage = async data => {console.log(data)//这里就是跟后台约定好需要传递什么参数const params = {file: data,fileName: data.fileName, }//上传接口const res = await uploads(params);if (res && res.code === 200) {//页面上显示图片 后端返回的图片地址imgurl.value = res.data.url;//关闭弹窗imgref.value.close()}
}/*** axiso 封装一般这么写 都是采用 FormData的形式  注意请求头 headers    'Content-Type': 'multipart/form-data'* * export const uploads = params => {const data = new FormData()data.append('file', params.file, params.fileName)return request({headers: {'Content-Type': 'multipart/form-data'},url: '/,method: 'post',data,})
}*/</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云windwos 安装oracle数据库,外部用工具连接不上,只能在服务器本机通过127.0.0.1 连接

1. 首先检查阿里云服务器安全组端口是否开放 oracle 数据库端口 2. 其次找到oracle 安装的目录&#xff0c;打开这俩个文件&#xff0c;将localhost 修改为 服务器本机名称 3.重启oracle 监听服务&#xff0c;就可以连接了

技术部工作职能规划分析

前言 技术部的职能。以下是一个基本的框架,其中涵盖了技术部在公司中的关键职能和子职能。 主要职能 技术部门的主要职能分为以下几个板块: - 技术规划与战略: 制定技术规划和战略,与业务团队合作确定技术需求。 研究和预测技术趋势,引领公司在技术创新和数字化转型方…

基于springboot实现智慧党建系统项目【项目源码】计算机毕业设计

基于springboot实现智慧党建系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以…

【Unity细节】Unity中为什么用字符串加载对象,检查多便都加载不出来—(命名细节)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

【Python】itertools模块,补充:可迭代对象、迭代器

Python中 itertools模块创建高效迭代器、处理序列数据集。 此模块所有函数返回迭代器&#xff0c;可用for循环获取迭代器中的内容&#xff0c;也可用list(...)用列表形式显示内容。 import itertools[ x for x in dir(itertools) if not x.startswith(_)] # 结果&#xff1a;…

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化的网页浏览程序&#xff0c;能够根据一定的规则和算法&#xff0c;从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术&#xff0c;它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

通俗理解词向量模型,预训练模型,Transfomer,Bert和GPT的发展脉络和如何实践

最近研究GPT&#xff0c;深入的从transfomer的原理和代码看来一下&#xff0c;现在把学习的资料和自己的理解整理一下。 这个文章写的很通俗易懂&#xff0c;把transformer的来龙去脉&#xff0c;还举例了很多不错的例子。 Transformer通俗笔记&#xff1a;从Word2Vec、Seq2S…

6 个有效且可用的顶级 Android 数据恢复工具

经过测试 42 种数据恢复软件产品&#xff0c;发现奇客数据恢复安卓版是 Android 设备的最佳选择。 过去几十年来&#xff0c;我一直在科技行业工作&#xff0c;经常帮助人们应对计算机灾难&#xff0c;包括丢失数据。 Android 数据恢复应用程序不在您的设备上运行&#xff0c…

IDEA中注释快捷键及模板

单行注释 将光标放置于要注释所在行&#xff0c;使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&#xff0c;去掉行注释 若需要将多行进行单行注释&#xff0c;只需要选中要注释的多行&#xff0c;然后使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&a…

聚焦数据要素跨域运营,构建数据要素统一大市场地方数据局局长闭门会正式召开

11月23日&#xff0c;在第二届全球数字贸易博览会期间&#xff0c;杭州市数据资源局、中国电子云、杭州数据交易所联合组织各地数据主管部门&#xff0c;召开构建数据要素统一大市场地方数据局局长闭门会&#xff0c;交流数据要素统一大市场构建思路&#xff0c;共探公共数据运…

基于springboot实现农机电招平台系统项目【项目源码+论文说明】

基于springboot实现农机电招平台系统演示 摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算…

软件开发中对图片的加工处理的一些个人思考和总结

前言&#xff1a; 最近在公司做项目的时候&#xff0c;有一个业务场景就是同一张图片&#xff0c;在不同的位置上展示的效果是不一致的&#xff0c;其实理解起来也很简单&#xff0c;就以大家熟悉的微信头像而言&#xff0c;我们在正常使用的情况下&#xff0c;一个微信头像的大…

寻找多个项目的漏洞赏金实战,不同技术的详细实现

寻找多个项目的漏洞赏金实战,不同技术的详细实现。 破-解Slack App得到3500美金漏洞赏金 文章的核心要点如下: 漏洞发现:作者在Slack的安卓应用中发现了一个漏洞。这个漏洞是由于目录遍历,导致可以窃取密码。这个漏洞的重要性在于,它允许“跳跃”在账户之间,也就是说,你…

[kingbase锁等待问题分析]

参考文章:https://www.modb.pro/db/70021 概述 为了确保复杂的事务可以安全地同时运行&#xff0c;kingbase&#xff08;PostgreSQL&#xff09;提供了各种级别的锁来控制对各种数据对象的并发访问&#xff0c;使得对数据库关键部分的更改序列化。事务并发运行&#xff0c;直到…

Linux安全之AIDE系统入侵检测工具安装和使用

一、AIDE 系统入侵检测工具简介 AIDE&#xff0c;全称为Advanced Intrusion Detection Environment&#xff0c;是一个主要用于检测文件完整性的入侵检测工具。它能够构建一个指定文件的数据库&#xff0c;并使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性&am…

Django(十、中间件)

文章目录 一、中间件的介绍中间件有什么用中间件功能自定义中间中间件的顺序 一、中间件的介绍 中间件顾名思义&#xff0c;是介于request与response处理之间的一道处理过程&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出。因为改变的是全局&…

U盘启动制作工具Rufus

U盘启动制作工具Rufus 下载U盘启动制作工具Rufus&#xff0c;进入Rufus官网&#xff1a;http://rufus.ie/en/&#xff0c;打开之后往后滑动&#xff0c;找到download即可点击下载。 需要插入U盘 首先需要插入U盘&#xff0c;如果U盘有重要文件一定要备份&#xff0c;然后右键…

Grails 启动

Grails系列 Grails项目启动 文章目录 Grails系列Grails一、项目创建二、可能的问题1.依赖下载2.项目导入到idea失败3.项目导入到idea后运行报错 Grails Grails是一款基于Groovy语言的Web应用程序框架&#xff0c;它使用了许多流行的开源技术&#xff0c;如Spring Framework、…

内衣洗衣机怎么选?性价比高的小型洗衣机推荐

在机器解放了双手的时代中&#xff0c;洗衣机走进了千家万户&#xff0c;虽然在某种程度上缓解了人们手洗衣服的压力&#xff0c;但还是有不少人选择了人工手洗自己的内衣内裤&#xff0c;甚至连袜子都是手工洗的&#xff0c;这让人很是郁闷&#xff0c;倒不是说洗衣机不方便&a…

SpringBoot整合SpringSecurity+jwt+knife4生成api接口(从零开始简单易懂)

一、准备工作 ①&#xff1a;创建一个新项目 1.事先创建好一些包 ②&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>&…