Vue-Cropper头像裁剪插件使用

1. 效果预览

在这里插入图片描述

2. 插件介绍

官网地址:[GitHub - xyxiao001/vue-cropper: A simple picture clipping plugin for vue](https://github.com/xyxiao001/vue-cropper?from=thosefree.com)

3 . 插件使用

下载插件

npm install vue-cropper@next

3 . 封装好的代码,拿来用即可

使用注意点

  • 组件内引用-必须

    1.  import 'vue-cropper/dist/index.css'import {VueCropper} from 'vue-cropper'import {getCurrentInstance, ref, reactive, watch} from 'vue'
      
  • 如下片段可自行更改,

    •   const dp = defineProps({ // 接收父组件参数realTime: "", // 实时时间})const de = defineEmits(["popUpClose"])const avatarUpload = () => { // 图片上传事件cropper.value.getCropBlob(data => {const formData = new FormData();formData.append("id", sessionStorage.getItem("userid"));formData.append('mf',data);  // file是你的文件对axios.post('/person/uploadAvatar', formData).then(response => {	// 处理后台返回的结果if(response.code !== 200) return ElMessage.error(response.msg)ElMessage.success(response.msg)de("popUpClose", response.data)}).catch(error => { // 处理错误ElMessage.error(error.message)throw error});})}
      

封装组件代码:

<template><div class = "avatar-container" @click = ""><el-row><el-col :span = "12" style = "width: 600px; height: 300px"><vue-cropperref = "cropper":img = "options.img":info = "true":autoCrop = "options.autoCrop":autoCropWidth = "options.autoCropWidth":autoCropHeight = "options.autoCropHeight":fixedBox = "options.fixedBox":outputType = "options.outputType"@realTime = "realTime"/></el-col><!-- 实时预览部分 --><el-col :span = "12" style = "height: 300px"><div class = "preview-box"><img v-if = "previews.url" :src = "previews.url" :style="previews.img"/><span v-else></span></div></el-col></el-row><el-row style = "margin-top: 12px"><el-col :span = "12"><el-row><el-col :span = "8"><el-uploadaction = "#":http-request = "() => {}":before-upload = "beforeUpload":show-file-list = "false"><el-button>选择</el-button></el-upload></el-col><el-col :span = "4"><el-button :icon = "Plus" @click = "changeScale(1)"></el-button></el-col><el-col :span = "4"><el-button :icon = "Minus" @click = "changeScale(-1)"></el-button></el-col><el-col :span = "4"><el-button :icon = "RefreshLeft" @click = "rotateLeft()"></el-button></el-col><el-col :span = "4"><el-button :icon = "RefreshRight" @click = "rotateRight()"></el-button></el-col></el-row></el-col><el-col :span = "4" :offset = "8" style = "margin-left: 22.3%"><el-button type = "primary" @click = "avatarUpload()">提 交</el-button></el-col></el-row></div></template><script setup>import {Plus, Minus, RefreshLeft, RefreshRight} from '@element-plus/icons-vue'import {ElMessage} from 'element-plus'import 'vue-cropper/dist/index.css'import {VueCropper} from 'vue-cropper'import {getCurrentInstance, ref, reactive, watch} from 'vue'import axios from "axios";const {proxy} = getCurrentInstance()const options = reactive({img: "https://tse1-mm.cn.bing.net/th/id/OIP-C.rBx_awzG233bGXk-4h3eeAHaFL?w=262&h=184&c=7&r=0&o=5&dpr=1.3&pid=1.7", // 裁剪图片的地址autoCropWidth: 200, // 默认生成截图框宽度 默认容器的 80%autoCropHeight: 200, // 默认生成截图框高度 默认容器的 80%outputType: 'png', // 裁剪生成图片的格式 jpeg, png, webpautoCrop: true, // 是否默认生成截图框fixedBox: false // 固定截图框大小})let previews = ref({url: '',img: '',})// 修改图片大小 正数为变大 负数变小const changeScale = (num) => {num = num || 1proxy.$refs.cropper.changeScale(num)}// 向左边旋转90度const rotateLeft = () => {proxy.$refs.cropper.rotateLeft()}// 向右边旋转90度const rotateRight = () => {proxy.$refs.cropper.rotateRight()}// 上传图片处理const beforeUpload = (rawFile) => {if (rawFile.type.indexOf('image/') == -1) {ElMessage.error('请上传图片类型文件!')return false}if (rawFile.size / 1024 / 1024 > 2) {ElMessage.error('文件大小不能超过2MB!')return false}const reader = new FileReader()reader.readAsDataURL(rawFile)reader.onload = () => {// 图片在这里if (typeof reader.result === "string") {options.img = reader.result}}}// 实时预览事件const realTime = (data) => {previews.value = data}const cropper = ref(null);const getBase64 = () => { // 获取截图的base64编码cropper.value.getCropData(data => {console.log(data)})}const getBlob = () => { // 获取截图的blobcropper.value.getCropBlob(data => {console.log(data)})}const dp = defineProps({ // 接收父组件参数realTime: "", // 实时时间})const de = defineEmits(["popUpClose"])const avatarUpload = () => { // 图片上传事件console.log(sessionStorage.getItem("userid"))cropper.value.getCropBlob(data => {const formData = new FormData();formData.append("id", sessionStorage.getItem("userid"));formData.append('mf',data);  // file是你的文件对axios.post('/person/uploadAvatar', formData).then(response => {	// 处理后台返回的结果if(response.code !== 200) return ElMessage.error(response.msg)ElMessage.success(response.msg)de("popUpClose", response.data)}).catch(error => { // 处理错误ElMessage.error(error.message)throw error});})}</script><style lang = "scss" scoped>.avatar-container {.img-box {border-radius: 50%;border: 1px solid #ccc;width: 10vw;height: 10vw;}}.preview-box {position: absolute;top: 50%;transform: translate(50%, -50%);width: 200px;height: 200px;border-radius: 50%;border: 1px solid #ccc;overflow: hidden;}
</style>

父组件代码 - 【可要可不要】

效果预览

在这里插入图片描述

注意点

  • 根据自己的需求舍 - 留
<script setup>
import {useRoute, useRouter} from 'vue-router';
import {onMounted, reactive, ref} from "vue";
import AvatarUpload from "./avatarUpload.vue";const router = useRouter()const rt = reactive({personDTO: {}, // 个人信息对象show: false,realTime: '', // 实时时间
})const popUpClose = (data) => {rt.show = false // 关闭rt.personDTO.photo = data // 更新头像
}let showOverlay = ref(false)const upload = () => { // 用户头像上传if(showOverlay) {console.log("uploading avatar")rt.show = truert.realTime = new Date().getTime()}
}</script><template><el-row :gutter = "20"><el-col :span = "6"> <!-- 左卡片 --><el-card><div>个人信息</div><el-divider/><el-row type = "flex" justify = "center"><div@mouseover = "showOverlay = true"@mouseleave = "showOverlay = false"@click = "upload()"style = "position: relative; cursor: pointer;"><el-avatar :size = "120" :src = "`data:image/png;base64,${rt.personDTO.photo}`"/><div v-if = "showOverlay"style = "position: absolute; border-radius:50%; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); display: flex; justify-content: center; align-items: center;"><span style = "color: white; font-size: 24px;">+</span></div></div></el-row><!--弹出编辑--><el-dialog v-model = "rt.show" style = "width:1000px; height: 800px"><AvatarUpload @popUpClose = "popUpClose" :realTime = "rt.realTime"/></el-dialog><el-divider/></el-card></el-col></el-row></template><style scoped>
* {font-size: 12px;
}.el-text-right {text-align: right;
}
</style>

EDN ! !!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

FL Studio Fruity Edition2024中文入门版Win/Mac

FL Studio Fruity Edition2024是一款功能强大的音乐制作软件&#xff0c;适合初学者和音乐爱好者使用。它提供了丰富的音乐制作工具&#xff0c;包括音频录制、编辑、混音以及MIDI制作等功能&#xff0c;帮助用户轻松创作出动人的音乐作品。 FL Studio 21.2.3 Win-安装包下载如…

使用Scrapy将数据提取到数据库中,进行处理

我们将数据处理的方式&#xff0c;最开始csv文件 再到与数据库建立联系 代码&#xff1a; Spider: import scrapyclass ShuangseqiuSpider(scrapy.Spider):name "shuangseqiu"allowed_domains ["sina.com.cn"]start_urls ["https://view.lottery…

[NOIP2011 普及组] 数字反转

AC代码&#xff1a; #include<iostream>using namespace std;int main() {long long n;cin >> n;long long temp n;long long sum 0;while(temp ! 0){int c temp % 10;sum sum * 10 c;temp temp / 10;}printf("%lld",sum);return 0; }

vue3 + vite + ts 中使用less文件全局变量

文章目录 安装依赖新建css变量文件全局引入css变量文件使用css变量 一、安装依赖 npm install less less-loader --save-dev 二、新建CSS变量文件 (1) :在根目录下的src文件中 src-> asset -> css ->glibal.less // glibal.less :root{--public_background_font_Col…

跟着cherno手搓游戏引擎【26】Profile和Profile网页可视化

封装Profile&#xff1a; Sandbox2D.h:ProfileResult结构体和ProfileResult容器&#xff0c;存储相应的信息 #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void OnAttach()ove…

python中的数字类型Number

Python 数字(Number) Python 数字数据类型用于存储数值。 数据类型是不允许改变的&#xff0c;这就意味着如果改变数字数据类型的值&#xff0c;将重新分配内存空间。 以下实例在变量赋值时 Number 对象将被创建&#xff1a; var1 1 var2 10Python 支持三种不同的数值类型…

蜣螂优化算法DBO求解不闭合MD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09; 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得…

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

SQL注入之order by脚本盲注

一、环境 还是用上次搭建的sql-labs靶机环境 搭建sql注入环境 二、什么是order by盲注 在有的时候我们进行sql注入时&#xff0c;源码的查询语句后面为order by&#xff1b; 众所周知&#xff0c;order by 后面接的字段或者数字不一样&#xff0c;那么这个数据表的排序就会…

嵌入式学习第二十一天!(线程)

线程&#xff1a; 1. 基本概念&#xff1a; 线程&#xff1a;线程是一个轻量级的进程&#xff0c;位于进程空间内部&#xff0c;一个进程中可以创建多个线程 2. 线程创建&#xff1a; 线程独占栈空间&#xff0c;文本段、数据段和堆区与进程共享 3. 线程调度&#xff1a; 与进程…

探索比特币现货 ETF 对加密货币价格的潜在影响

撰文&#xff1a;Sean&#xff0c;Techub News 文章来源Techub News&#xff0c;搜Tehub News下载查看更多Web3资讯。 自美国比特币现货交易所交易基金&#xff08;ETF&#xff09;上市以来&#xff0c;比特币现货 ETF 的相关信息无疑成为了影响比特币价格及加密货币市场走向…

Java四大引用详解:强引用、软引用、弱引用、虚引用

在JDK1.2以前的版本中&#xff0c;当一个对象不被任何变量引用&#xff0c;那么程序就无法再使用这个对象。也就是说&#xff0c;只有对象处于可触及状态&#xff0c;程序才能使用它。这就像在商店购买了某样物品后&#xff0c;如果有用就一直保留它&#xff0c;否则就把它扔到…

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中&#xff0c;对于接口API发布URL访问路径&#xff0c;一般都是在类上标识RestController或者Controller注解&#xff0c;然后在方法上标识RequestMapping相关注解&#xff0c;比如&#xff1a;PostMapping、GetMapping注解&#xff0c;通…

【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 光照的原理光源吸收和散射着…

LinkedList的使用(Java)

目录 一、介绍二、LinkedList的使用1、LinkedList的构造2、 LinkedList的其他常用方法介绍3、LinkedList的遍历 三、ArrayList和LinkedList的区别 一、介绍 LinkedList的底层是双向链表结构&#xff0c;由于链表没有将元素存储在连续的空间中&#xff0c;元素存储在单独的节点…

开发知识点-.netC#图形用户界面开发之WPF

C#图形用户界面开发 框架简介WinForms(Windows Forms):WPF(Windows Presentation Foundation):UWP(Universal Windows Platform):MAUI(Multi-platform App UI):选择控件参考文章随笔分类 - WPF入门基础教程系列基于C#语言的GUI开发,主要介绍WPF框架

IP对讲终端SV-6002(防水)

SV-6002&#xff08;防水&#xff09;是一款IP对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;解码后播放&#xff0c;外部DC12~24V电源供电端子&#xff0c;提供单路2W的音频输出。基于TCP/IP网络通信协议和数字音频技术&#xff0c;…

MATLAB练习题:并行计算的parfor循环

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 在MATLAB中&#xff0c;parfor&#xff08;Parallel for&…

Centos配置SSH并禁止密码登录

CentOS8 配置SSH使用密钥登录并禁止密码登录 一、概念 SSH 为 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。 SSH提供两个级别的认证&#xff1a; 基于口令的认证 基于密钥的认证 基本使…

【大厂AI课学习笔记NO.55】2.3深度学习开发任务实例(8)模型训练

作者简介&#xff1a;giszz&#xff0c;腾讯云人工智能从业者TCA认证&#xff0c;信息系统项目管理师。 博客地址&#xff1a;https://giszz.blog.csdn.net 声明&#xff1a;本学习笔记来自腾讯云人工智能课程&#xff0c;叠加作者查阅的背景资料、延伸阅读信息&#xff0c;及学…