vue-cropper图片裁剪(vue2与vue3)

news/2024/10/14 9:41:51

在项目中,前端开发经常会遇到有图片上传的需求,而别人的组件大多都满足不了当下产品的需求,这是往往我们得去依靠组件自己自定义一个项目通用的裁剪组件

一、vue-cropper安装依赖:

vue2:

npm install vue-cropper  或  yarn add vue-cropper

vue3:

npm install vue-cropper@next  或  yarn add vue-cropper@next

二、引入相关css文件

import 'vue-cropper/dist/index.css' 

vue3才需要引入样式,vue2不需要

注意:这个样式一定记得引啊,我就是忘引入,裁剪框一直弄不出来

三、自定义组件

<!-- 裁剪图片工具-->
<template><view class="upgrade-box"><szy-common-popup poptitle="裁剪图片" showPopup position="center" @close_popup="close_popup"><view class="prompt-content"><view class="inner-box"><view class="tip">提示:按微信公众号封面图2:35:1或1:1比例选择保留区域后,裁剪上传。</view><!-- 选择裁剪比例 --><view class="group-btn"><viewclass="item":class="option.fixedNumber[0] === 2.35 ? 'item active' : 'item'"@click="cropSize(2.35, 1)">2:35:1</view><viewclass="item":class="option.fixedNumber[0] === 1 ? 'item active' : 'item'"@click="cropSize(1, 1)">1:1</view></view><!-- 裁剪区域 --><viewclass="cropper-box":style="{ width: `${imgObj.width}px`, height: `${imgObj.height}px` }"><VueCropperref="cropperRef":img="option.img":output-size="option.outputSize":output-type="option.outputType":can-scale="option.canScale":auto-crop="option.autoCrop":full="option.full == '0'":auto-crop-width="option.autoCropWidth":auto-crop-height="option.autoCropHeight":can-move-box="option.canMoveBox":can-move="option.canMove":center-box="option.centerBox":info="option.info":fixed-box="option.fixedBox":fixed="option.fixed":fixed-number="option.fixedNumber"/></view></view><view class="button-group"><view class="dialog-button" @click="close_popup"><text class="dialog-button-text">取消</text></view><view class="dialog-button button-confirm" @click="cropperClick"><text class="dialog-button-text">保存/上传</text></view></view></view></szy-common-popup></view>
</template><script lang="ts" setup>import { onMounted, ref } from 'vue';import { VueCropper } from 'vue-cropper';import 'vue-cropper/dist/index.css'; // vue3才需要引入样式,vue2不要const props = defineProps({coverFile: {type: String,require: '',},});// 裁剪组件Refconst cropperRef: any = ref({});// 裁剪组件需要使用到的参数interface Options {img: string;outputSize: number; // 裁剪生成图片质量outputType: string; // 裁剪生成图片格式canScale: boolean; // 图片是否允许滚轮播放autoCrop: boolean; // 是否默认生成截图框 falseinfo: boolean; // 是否展示截图框信息autoCropWidth: number; // 生成截图框的宽度autoCropHeight: number; // 生成截图框的高度canMoveBox: boolean; // 截图框是否可以拖动enlarge: number;fixedBox: boolean; // 固定截图框的大小fixed: boolean; // 是否开启截图框宽高固定比例fixedNumber: number[]; // 截图框的宽高比例 默认2.35, 1:1,canMove: boolean; // 上传图片是否可拖动centerBox: boolean; // 截图框限制在图片里面accept: string; // 上传允许的格式infoTrue: boolean;original: boolean;full: boolean | string;}const option = ref<Options>({img: String(props.coverFile), // 裁剪图片地址outputSize: 1, // 裁剪生成图片质量outputType: 'jpeg', // 裁剪生成图片格式canScale: true, // 图片是否允许滚轮播放autoCrop: true, // 是否默认生成截图框 falseinfo: true, // 是否展示截图框信息autoCropWidth: 235, // 生成截图框的宽度autoCropHeight: 100, // 生成截图框的高度enlarge: 1, // 采集后放大倍数full: '0', // 是否开启原尺寸裁剪 0 原尺寸 1当前尺寸infoTrue: true,original: true,canMoveBox: true, // 截图框是否可以拖动fixedBox: false, // 固定截图框的大小fixed: true, // 是否开启截图框宽高固定比例fixedNumber: [2.35, 1], // 截图框的宽高比例 默认2.35, 1:1,canMove: true, // 上传图片是否可拖动centerBox: true, // 截图框限制在图片里面accept: 'image/jpeg,image/jpg,image/png,image/gif,image/x-icon',});const handleSelectImg = (imgItem: any) => {option.value.img = String(imgItem);};// 外框大小const imgObj = ref({width: 300,height: 200,});// 修改截图框尺寸,宽,高const cropSize = (w: number, h: number) => {option.value.fixedNumber = [w, h];cropperRef.value.refresh();};// 裁剪后const cropperClick = () => {cropperRef.value.getCropData((data: any) => {emit('cropperClick', data);});};//const emit = defineEmits(['onClose', 'cropperClick']);const close_popup = () => {emit('onClose');};onMounted(() => {handleSelectImg(String(props.coverFile));});
</script><style lang="scss" scoped>.upgrade-box {.inner-box {.tip {font-size: 30rpx;text-align: left;}.group-btn {display: flex;align-items: center;justify-content: flex-start;margin: 20rpx 0rpx;.item {flex: 1;display: inline-flex;background: rgba(0, 0, 0, 0.03);border-radius: 6rpx 6rpx 0 0;text-align: center;justify-content: center;align-items: center;padding: 0 30rpx;height: 80rpx;white-space: nowrap;font-size: 34rpx;cursor: pointer;color: #353535;position: relative;&:after {content: '';position: absolute;left: 0;top: 0;bottom: 0;width: 1rpx;background: #eee;height: 100%;display: block;}&:first-child {border-radius: 6rpx 0 0 6rpx;&:after {display: none;}}&.active {background: $uni-main-color;color: #fff;border-radius: 6rpx;}}}.cropper-box {background: #eee;overflow: hidden;}}}
</style>

四、展示样式

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

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

相关文章

数据准备指南:10种基础特征工程方法的实战教程

在数据分析和机器学习领域,从原始数据中提取有价值的信息是一个关键步骤。这个过程不仅有助于辅助决策,还能预测未来趋势。为了实现这一目标,特征工程技术显得尤为重要。特征工程是将原始数据转化为更具信息量的特征的过程。本文将详细介绍十种基础特征工程技术,包括其基本…

人员着装识别系统

人员着装识别系统基于AI视频监控视觉分析技术,人员着装识别系统通过现场安装的摄像头识别和预警工厂人员及工地人员是否按要求穿戴着装,以确保安全生产和作业环境。人员着装识别系统利用先进的图像分析和识别技术,在工厂和工地的关键区域安装监控设备,实时监测人员的着装情…

二分图 学习笔记

相关链接 题单:https://www.luogu.com.cn/training/79728 文章:https://www.cnblogs.com/streamazure/p/13778319.html https://oi-wiki.org/graph/bi-graph/二分图的判定 如果一张无向图,可以将图中的点分成两个集合 \(A,B\),使得同一个集合的所有点互不相交,那么它即是一…

裸露土堆识别算法

裸露土堆识别算法基于人工智能视觉分析技术,裸露土堆识别算法通过对路面/建筑工地的图像进行处理和分析,判断土堆的裸露情况。裸露土堆识别算法首先利用图像处理技术,提取出图像中的土堆区域。然后,通过计算土堆中被绿色防尘网覆盖的比例,判断土堆是否裸露。若超过40%的土…

相位滞后校正

.rtcContent { padding: 30px } .lineNode { font-size: 10pt; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal }% 2024年10月13日 无锡岚莅电气 刘晓东 整理 《MATLAB与SIMULINK工程应用》 Mokhtari著中…

Nacos-2.0.4 安装

1、配置环境变量 正确安装好JDK11、并配置JAVA_HOME环境变量 2、安装Nacos ​ 将Nacos压缩包解压到英文目录下即可 3、导入SQL创建名为nacos的数据库 导入nacos\conf\nacos-mysql.sql文件到nacos数据库中 修改nacos\conf\application.properties配置文件4、启动Nacos DOS进入na…

不系安全带抓拍自动识别系统

不系安全带抓拍自动识别系统的原理是通过摄像头和图像识别算法,不系安全带抓拍自动识别系统对高空作业人员的穿戴行为进行实时监测和识别。系统利用高清摄像头,对高空作业场景进行监控,当检测到人员未佩戴安全带时,不系安全带抓拍自动识别系统会自动抓拍并进行安全带识别,…

APK 加固方案

1:APK的解压后的结构: 2:如何反编译: 3:apk的打包流程: 4:应用的启动流程 5:原理: 1)APP发送attach ApplicationThread到AMS的时候,会读取清单文件manifest里面的application,那我们就用ProxyApplicaiton替换掉原生的application,这样就走到了加密的applicatio…