Vue3使用vue-cropper截图上传

news/2024/11/17 1:54:10/文章来源:https://www.cnblogs.com/itljf/p/18200763

!!!!!!!已使用另一个截图上传工具,稍后更新博客!!!!!!
使用vue-cropper进行截图上传

先安装

npm i vue-cropper

编写组件

在components中添加imageCropper.vue

代码如下

<template><div><div><imgv-if="value"class="mb-2"style="max-width: 200px; max-height: 200px":src="value"/></div><input type="hidden" v-model="value" :name="props.name" /><el-button size="large" type="primary" @click="updateImage">上传图片</el-button><el-dialog v-model="dialogVisible" title="上传图片" width="50%" v-loading="loading"><div class="d-flex"><div class="flex-grow-1" style="height: 400px"><vueCropperstyle="width: 100%; height: 100%"ref="cropper"@realTime="realTime":img="option.img":outputSize="option.outputSize":outputType="option.outputType":info="option.info":canScale="option.canScale":autoCrop="option.autoCrop":autoCropWidth="option.autoCropWidth":autoCropHeight="option.autoCropHeight":fixedBox="option.fixedBox":fixed="option.fixed":fixedNumber="option.fixedNumber":canMove="option.canMove":canMoveBox="option.canMoveBox":original="option.original":centerBox="option.centerBox":infoTrue="option.infoTrue":full="option.full":enlarge="option.enlarge":mode="option.mode":maxImgSize="option.maxImgSize":limitMinSize="option.limitMinSize"></vueCropper></div><div style="flex-basis: 250px"><div class="d-flex justify-content-center"><div v-if="option.img" :style="previewStyle" class="mb-4"><div :style="previews.div"><img :src="previews.url" :style="previews.img" /></div></div></div><div class="text-center"><ahref="javascript:;"class="btn btn-primary"style="width: 180px"@click="selectFile">重新选择图片</a><inputtype="file"style="width: 0; height: 0"accept="image/*"ref="ref1"@change="handleFileChange"/></div><div class="text-center mt-4"><el-button type="primary" @click="chengeSize(1)" size="large"><i class="fas fa-search-plus text-white me-1"></i>放大</el-button><el-button type="primary" @click="chengeSize(-1)" size="large"><i class="fas fa-search-minus text-white me-1"></i>缩小</el-button></div><div class="text-center mt-4"><el-button type="primary" @click="rotateLeft()" size="large"><i class="bi bi-arrow-counterclockwise text-white me-1"></i>左转</el-button><el-button type="primary" @click="rotateRight()" size="large"><i class="bi bi-arrow-clockwise text-white me-1"></i>右转</el-button></div><div class="text-center mt-4">截图大小:{{ option.autoCropWidth }}px *{{ option.autoCropHeight }}px</div></div></div><template #footer><span class="dialog-footer"><el-button size="large" @click="dialogVisible = false">取消</el-button><el-button size="large" ref="submitButton" type="primary" @click="getImage">确定选择</el-button></span></template></el-dialog></div>
</template><script setup lang="ts">
import "vue-cropper/dist/index.css";
import { VueCropper } from "vue-cropper";
import { type ComponentInternalInstance, getCurrentInstance, nextTick, onMounted, reactive, ref } from "vue";
import ApiService from "@/core/services/ApiService";
import { computed, defineEmits } from "vue";
import swalMessage from "@/core/helpers/swalMessage";const { proxy } = getCurrentInstance() as ComponentInternalInstance;const props = defineProps(["modelValue","name","success","width","height","fixedBox",
]);const option = ref({img: "", // 裁剪图片的地址 url 地址, base64, bloboutputSize: 1, // 裁剪生成图片的质量outputType: "png", // 裁剪生成图片的格式 jpeg, png, webpinfo: true, // 裁剪框的大小信息canScale: true, // 图片是否允许滚轮缩放autoCrop: true, // 是否默认生成截图框autoCropWidth: 150, // 默认生成截图框宽度autoCropHeight: 150, // 默认生成截图框高度fixedBox: true, // 固定截图框大小 不允许改变// fixedBox: props.fixedBox ?? true, // 固定截图框大小 不允许改变fixed: true, // 是否开启截图框宽高固定比例,这个如果设置为true,截图框会是固定比例缩放的,如果设置为false,则截图框的宽高比例就不固定了fixedNumber: [1, 1], // 截图框的宽高比例 [ 宽度 , 高度 ]canMove: true, // 上传图片是否可以移动canMoveBox: true, // 截图框能否拖动original: false, // 上传图片按照原始比例渲染centerBox: false, // 截图框是否被限制在图片里面infoTrue: true, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高full: true, // 是否输出原图比例的截图enlarge: 1, // 图片根据截图框输出比例倍数mode: "contain", // 图片默认渲染方式 contain , cover, 100px, 100% autolimitMinSize: [10,10], // 图片默认渲染方式 contain , cover, 100px, 100% automaxImgSize: 2000, // 图片默认渲染方式 contain , cover, 100px, 100% auto
});
const ref1 = ref<any>([]);
const cropper = ref<any>({});const emit = defineEmits(["update:modelValue", "onSuccess"]);const value = computed({get() {return props.modelValue;},set(value) {emit("update:modelValue", value);},
});const loading=ref(false);
const submitButton = ref<HTMLButtonElement | null>(null);//修改大小
const chengeSize = (num) => {cropper.value.changeScale(num);
};
//向左边旋转90度
const rotateLeft = () => {cropper.value.rotateLeft();
};
//向右边旋转90度
const rotateRight = () => {cropper.value.rotateRight();
};
const selectFile = () => {ref1.value.click();option.value.img = "";
};
const updateImage = () => {let width=(props.width && props.width>0) ? props.width : 150;let height=(props.height && props.height>0) ? props.height : 150;option.value.autoCropWidth=width;option.value.autoCropHeight=height;option.value.fixedNumber=[1,height/width];option.value.limitMinSize=[width,height];dialogVisible.value = true;nextTick(() => {selectFile();});
};
const handleFileChange = (e) => {let file = e.target.files[0];const reader = new FileReader();reader.readAsDataURL(file);reader.onload = () => {option.value.img = reader.result as string;};
};
const getImage = async () => {loading.value = true;await nextTick();await cropper.value.getCropBlob(async (data2) => {data2.name = 'image.png';// console.log(data2);var data = await ApiService.uploadFile(data2);// loading.value=false;if (data.success) {if (import.meta.env.VITE_APP_API_URL != "/") {value.value = import.meta.env.VITE_APP_API_URL + data.url;} else {value.value = data.url;}dialogVisible.value = false;emit("onSuccess");} else {swalMessage.error("上传失败")}});
};
const dialogVisible = ref(false);const show = () => {dialogVisible.value = true;
};
//实时预览
const previewStyle = ref({});
const previews = ref<any>({});const realTime = (data) => {previews.value = data as any;option.value.maxImgSize = option.value.autoCropWidth;option.value.full = option.value.autoCropWidth > previews.value.w;// 固定为 100 宽度previewStyle.value = {overflow: "hidden",margin: "0",zoom: 200 / previews.value.w,};
};
</script>
<style scoped></style>

文件上传和消息提示使用的是我其他封装的组件,见其他博客

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

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

相关文章

渗透提权基础--linux权限

linux用户权限 在Linux系统中,根据权限的不同,大致可以将用户分为三种:超级用户、普通用户和虚拟用户。序号1为超级用户,分析出他为超级用户并不仅仅是因为他的用户名为root,还有他的UID(用户ID)和GID(组ID)为0,这是超级用户很重要的属性,且他的HOME目录为/root。 …

浅谈 FHQ Treap

浅谈 FHQ Treap 目录浅谈 FHQ Treap简单介绍前置操作结构分裂 split合并 merge一般操作Insertdelete查询排名为 \(x\) 的数查询 \(v\) 的排名 rank查询 \(x\) 的前驱 precursor查询 \(x\) 的后继 successor版题 简单介绍 FHQ Treap,以下简写为 \(fhq\),是一种treap(树堆)的变体…

INFINI Labs 产品更新 | Easysearch 1.8.0 发布数据写入限流功能

INFINI Labs 产品又更新啦~,包括 Easysearch v1.8.0、Gateway、Console、Agent、Loadgen v1.25.0。本次各产品更新了很多亮点功能,如 Easysearch 新增数据写入限流功能,可实现节点、分片级限流;Gateway 修复数据迁移过程中因消费不及时解压缩导致部分数据记录损坏而丢失记录…

OpenStack Centos7 T版本搭建

目录Centos7搭建OpenStack T版本 --上1. 环境准备(所有节点操作)1.1 修改主机名1.2 关闭selinux 以及防火墙1.3 修改hosts1.4 配置时间同步controller 操作compute以及其他节点操作1.5 配置OpenStack 软件包1.6 安装数据库1.7 安装消息队列1.8 安装memcached1.9 安装etcd2. 安装…

数据库开发基础(JDBC)

时间:2024-05-17日,星期五 数据库开发基础(Java) 课程内容 JDBC快速入门、使用JDBC开发细节、连接池与JDBC进阶使用JDBC使用步骤数据库查询方法数据库写入方法SQL注入攻击的应对连接池的使用Apache Commons DBUtilsJDBC快速入门 JDBC是Java中为了去方便使用各种数据而创造出…

视野修炼-技术周刊第84期 | Mako

① npmmirror 下线 unpkg 服务 ② Mako - 又一基于 Rust 的构建工具 ③ Icnes - 图标集合检索 ④ go-masonry-gallery - 图片瀑布流页面生成 ⑤ Color Pick - 在线从图片中提取颜色的 ⑥ 制作 CSS 形状的现代指南 ⑦ 针对前端初学者的项目合集 ⑧ Jan - 本地运行大模型客户端欢…

jQuery2-动画技术入门指南-全-

jQuery2 动画技术入门指南(全)原文:zh.annas-archive.org/md5/71BE345FA56C4A075E859338F3DCA6DA 译者:飞龙 协议:CC BY-NC-SA 4.0序言 jQuery 是一个跨浏览器的 JavaScript 库,旨在简化 HTML 的客户端脚本编写,并且是当今最流行的 JavaScript 库。利用 jQuery 提供的功…

EDP .Net开发框架--业务模型

EDP是一套集组织架构,权限框架【功能权限,操作权限,数据访问权限,WebApi权限】,自动化日志,动态Interface,WebApi管理等基础功能于一体的,基于.net的企业应用开发框架。通过友好的编码方式实现数据行、列权限的管控。平台下载地址:https://gitee.com/alwaysinsist/edp…

CentOS挂载硬盘

1.查看新添加的硬盘 fdisk -l2.挂载到/data目录 mount /dev/vdb1 /data 3.设置开机自启 vi /etc/fstab 在最后一行添加 /dev/vdb1 /data ext4 defaults 0 0

sed编辑器和awk

目录1.sed的执行过程(1)sed 的工作流程(2)打印内容(3)删除(4)替换(5)打印被修改的行(6)插入(7)复制粘贴2.awk(1)工作原理 1.sed的执行过程 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处…

“复兴杯”2023第四届大学生网络安全精英赛排位赛 Writeup

时间跟全国信安初赛重了(),不过也是第一次在CTF AK了( 个人信息 个人排名:15 解题过程 1观察代码,使用科学技术法进行绕过,2.023e3也就是2.023*10^3=2023,弱比较时会化为2023,但是运算时后并不绝对等于2024。 输入得到flag。2 打开网站可以看到电脑账号是ly,使用过滤…