vue3中使用el-upload + tui-image-editor进行图片处理

news2024/11/21 2:37:32

效果如下
在这里插入图片描述

看之前请先看上一篇《vue3中使用组件tui-image-editor进行图片处理》中的
1、第一步安装
2、第二部封装组件
本篇只是在这基础上结合el-upload使用组件
3、第三步结合el-upload使用组件

<template>
  <el-dialog
    :title="dialogTitle"
    :modelValue="dialogVisible"
    width="55%"
    top="4vh"
    :before-close="closeDialog"
    :close-on-click-modal="false"
    destroy-on-close
  >
    <div class="newBox">
      
      <el-upload
        class="img-edit"
        :show-file-list="false"
        :accept="cropperObj.accpetType"
        :limit="cropperObj.limit"
        :on-change="cropperObj.handleAvatarSuccess"
        :before-upload="cropperObj.beforeAvatarUpload"
        :disabled="cropperObj.dealPicShow"
      >
        <div class="imgCorpper" v-if="cropperObj.dealPicShow"  @mouseenter="cropperObj.buttonopen" @mouseleave="cropperObj.buttonexit">
          <div class="imgCorpperY">
            <el-image  
            :src="cropperObj.previewViewer"
            :zoom-rate="1.2"
            :preview-src-list="cropperObj.srcList"
            :initial-index="4"
            fit="cover"/> 
            <el-image-viewer
              v-if="cropperObj.showImageViewer"
              @close="cropperObj.closeImgView"
              :url-list="cropperObj.srcList"
            />
            <div :class="cropperObj.showBack?'imgcurrent show':'imgcurrent'"  >
              <div class="imgBack"></div>
              <div class="imgicon">
                <el-icon @click="cropperObj.showPic"><ZoomIn /></el-icon>
                <el-icon @click="cropperObj.delePic"><Delete /></el-icon>
              </div>
            </div>
          </div>
        </div>
        <el-icon v-else class="img-edit-icon"><Plus /></el-icon>
      </el-upload>
      <!-- 上传提示 -->
      <div class="el-upload__tip" v-if="!cropperObj.dealPicShow">
        请上传大小不超过 <b style="color: #f56c6c">{{ cropperObj.fileSize }}MB</b>格式为 <b style="color: #f56c6c">{{ cropperObj.fileType.join("/") }}</b>的文件
      </div>
      <!-- 图片处理框 -->
      <SignImage 
        v-if="cropperObj.cVisible" 
        :dialogVisible.sync="cropperObj.cVisible" 
        :title="cropperObj.ctitle"
        :imgUrl="cropperObj.previewsImgUrl"
        @getNewImg="cropperObj.getNewImg"
        @closeCropperDialog="cropperObj.closeCropperView"
      ></SignImage>

    </div>
    
    <template #footer>
      <div class="dialog-footer">
        <!-- <el-button class="btn-sure" type="primary" @click="closeDialog">确 定</el-button> -->
        <el-button @click="closeDialog">取 消</el-button>
      </div>
    </template>
  </el-dialog>
</template>

<script setup>
import SignImage from '@/components/SignImage/index.vue'
import { importNewImg, editNewImg } from "@/api/back/home.js";
import { ref, reactive, watch } from "vue";

  const props = defineProps({
    dialogVisible: {
      type: Boolean,
      default: false,
    },
    dialogTitle: {
      type: String,
      default: "",
    },
    
  });

  // 关闭弹窗
  const emits = defineEmits(["closeDialog"]);
  const closeDialog = () => {
    emits("closeDialog");
  };


// new 背景图片
const cropperObj = reactive({
  fileType: ["png", "jpg", "jpeg"],
  accpetType:".png,.jpg,.jpeg",
  limit:1,
  fileSize:10,
  cVisible:false, // 显示切图弹框
  ctitle:"", // 弹框标题
  imgShow:false, //是否有图片
  previewsImgUrl:"", //图片地址
  srcList:[], //图片预览地址数组
  showBack:false, // 预览删除图层是否展示
  showImageViewer:false, // 是否预览
  previewViewer:"", // 处理后的图片地址
  dealPicShow:false, // 是否删除了处理后的图片
  // 开启编辑弹框
  openCropperView: () => {
    cropperObj.ctitle="图片"
    cropperObj.cVisible = true 
  },
  // 关闭编辑弹框所触发的事件
  closeCropperView: (data)=> {
    cropperObj.cVisible = false
  },
  // 预览删除图层显示
  buttonopen: ()=>{
    cropperObj.showBack = true
  },
  // 预览删除图层隐藏
  buttonexit: ()=>{
    cropperObj.showBack = false
  },
  // 预览开启
  showPic: ()=>{
    cropperObj.showImageViewer = true
  },
  // 预览隐藏
  closeImgView: ()=>{
    cropperObj.showImageViewer = false
  },
  // 删除图片
  delePic:()=>{
    cropperObj.previewsImgUrl ="";
    cropperObj.previewViewer = ""
    cropperObj.srcList=[]
    setTimeout(function(){
      cropperObj.dealPicShow = false
    },1000)
    cropperObj.imgShow = false
    // formData.backgroundUrl = "";
  },
  // 获取处理完的图片
  getNewImg:(val) =>{
    cropperObj.previewViewer = window.serverUrl.IMG_SERVER + val
    cropperObj.dealPicShow = true
    cropperObj.srcList=[cropperObj.previewViewer]
    // formData.backgroundUrl = val;
  },
  beforeAvatarUpload:(file)=> {
    let isImg = false;
    let fileExtension = "";
    if (cropperObj.fileType.length) {
      if (file.name.lastIndexOf(".") > -1) {
        fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
      }
      isImg = cropperObj.fileType.some((type) => {
        if (file.raw.type.indexOf(type) > -1) return true;
        if (fileExtension && fileExtension.indexOf(type) > -1) return true;
        return false;
      });
    } else {
      isImg = file.type.indexOf("image") > -1;
    }
    if (!isImg) {
      ElMessage.error(`格式不正确, 请上传${cropperObj.fileType.join("/")}图片格式文件!`);
      return false;
    } else {
      isImg = true;
    }
    if (cropperObj.fileSize) {
      const isLt = file.size / 1024 / 1024 < cropperObj.fileSize;
      if (!isLt) {
        proxy.$modal.msgError(`上传大小不能超过 ${cropperObj.fileSize} MB!`);
        // fileList.value = [];
        return false;
      }
    }
  },
  handleAvatarSuccess:(file, fileList)=> {
    const bgFormData = new FormData()
    bgFormData.append("file", file.raw);
    importNewImg(bgFormData).then(res => {
      cropperObj.previewsImgUrl = window.serverUrl.IMG_SERVER + res.fileName
      cropperObj.ctitle="图片处理"
      cropperObj.cVisible = true 
    })
  },
})


</script>

<style lang="scss"  scoped>
  .img-edit{
    display: flex;
    justify-content: center;
    align-items: center;
    font-size:1rem;
    width:148px;
    height: 148px;
    border:1px dashed #cdd0d6;
    position: relative;
    border-radius: 6px;
    .el-icon{
      width:0.35rem;
      height: 0.35rem;
      color:#909399;
    }
    .imgCorpper{
    display: flex;
    justify-content: center;
    align-items: center;
    font-size:1rem;
    width:148px;
    height: 148px;
    border:1px dashed #cdd0d6;
    position: relative;
    border-radius: 6px;
    cursor:pointer;
    .el-icon{
      width:0.35rem;
      height: 0.35rem;
      color:#909399;
    }
    .imgCorpperY{
      position: relative;
      width: 100%;
      height: 100%;
      border-radius: 6px;
      overflow: hidden;
      height: 100%;;
      >img{
        width: 100%;
        height: 100%;;
      }
      .el-image{
        width: 100%;
        height: 148px;
        max-height: 100%;;
      }
      .imgcurrent{
          display: none;
          position: absolute;
          width: 100%;
          height: 100%;
          top: 0;
          .imgBack{
            background: #00000082;
            width: 100%;
            height: 100%;
            position: absolute;
            z-index: 1;
          }
          .imgicon{
            position: absolute;
            width: 60%;
            margin: 0 20%;
            height: 100%;
            display: flex;
            justify-content: space-between;
            align-items: center;
            color: #fff;
            z-index: 2;
            .el-icon{
              color: #fff;
              // font-size: 1rem;
            }
          }
        }
        >.show{
          display:block;
        }
      }
    }
  }
  .img-edit:hover {
    border-color: #409EFF;
  }
</style>


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

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

相关文章

004-Windows下开发环境搭建

Windows下开发环境搭建 文章目录 Windows下开发环境搭建项目介绍版本控制工具Git 与 SVNWindow下安装Git Qt 开发工具静态编译Qt环境安装 串口模拟器比较工具SQLite 数据库查看小工具预告 关键字&#xff1a; Qt、 Qml、 开发环境、 Windows、 C 项目介绍 欢迎来到我们的 …

Elastic Universal Profiling™ 是一种连续分析解决方案,现已正式上市

作者&#xff1a;Israel Ogbole, Stephanie Boomsma 在软件无处不在且影响深远的世界中&#xff0c;效率的重要性不仅仅局限于业务范围。 高效的软件不仅有利于企业&#xff0c;而且有利于企业。 这对全球也有好处。 通过将计算效率作为核心目标&#xff0c;并为专业人员提供正…

WebGL光照介绍——平行光、环境光下的漫反射

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…

数据结构--哈希表,哈希函数(或者散列表、散列函数)

目录 哈希表的定义 处理冲突的方法--拉链法 散列查找 常见的散列函数&#xff08;构造哈希函数&#xff09; 除留余数法 直接定址法 数字分析法 平方取中法 处理冲突的方法--开放定址法 &#xff08;1&#xff09;线性探测法&#xff1a; &#xff08;2&#xff09…

笔记:Android 应用启动流程

1.点击图标&#xff0c;启动app 点击图标&#xff0c;实际是封装了一个 Intent 然后调用了 startActivity 方法 ComponentName componentName new ComponentName("包名", "activity 名称"); Intent intent new Intent(Intent.ACTION_MAIN); intent.set…

【问题处理】GIT合并解决冲突后,导致其他人代码遗失的排查

GIT合并解决冲突后&#xff0c;导致其他人代码遗失的排查 项目场景问题描述分析与处理&#xff1a;1. 警告分析2. 文件分析3. 问题关键4. 验证 解决策略总结 &#x1f4d5;作者简介&#xff1a;战斧&#xff0c;从事金融IT行业&#xff0c;有着多年一线开发、架构经验&#xff…

【Nacos】Nacos服务注册服务端源码分析(一)

上篇简单看了下Nacos客户端在服务注册时做了什么。 本篇开始分析Nacos在服务注册时&#xff0c;服务端的相关逻辑。 建议先阅读这篇文章&#xff1a;支持 gRPC 长链接&#xff0c;深度解读 Nacos 2.0 架构设计及新模型 回顾一下&#xff0c;上篇我们看了Nacos在服务注册时&a…

四种常用的自动化测试框架

一直想仔细研究框架&#xff0c;写个流水账似的测试程序不难&#xff0c;写个低维护成本的测试框架就很难了&#xff0c;所以研究多种测试框架还是很有必要的&#xff0c;知道孰优孰劣&#xff0c;才能在开始编写框架的时候打好基础&#xff0c;今天读到了KiKi Zhao的翻译文章&…

reverse_iterator 逆序迭代器

在上一篇 C迭代器 iterator&#xff08;与逆序迭代器&#xff09; 中&#xff0c;我们看到了迭代器的基本用法。 现在我们看看一个奇怪的现象 意料之外的减法运算 无符号数的 0 减 1 变成了什么&#xff1f; &#xff1f;已知 size_t 一般为 unsigned long long 类型。 #…

区块链(4):区块链去中心化

1 区块链白皮书中的公有链&#xff0c;私有链&#xff0c;联盟链概念介绍 区块链系统根据应用场景和设计体系的不同&#xff0c;一般分为公有链、联盟 链和专有链(私有链)。其中: 公有链的各个节点可以自由加入和退出网络&#xff0c;并参加链上数据的读 写&#xff0c;运行时…

SpringBoot+MyBatis flex实现简单增删改查

一&#xff1a;创建SpringBoot项目 SpringBoot版本选择2.7.15 勾选相关的选项&#xff0c;并点击Create 项目创建完成 二.pom文件添加相关的依赖 <dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starte…

排序——直接插入排序折半插入排序

文章目录 前言一、排序的基本概念1. 排序的定义2. 排序的分类1) 稳定排序2) 不稳定排序 二、插入排序1. 直接插入排序1&#xff09;直接插入排序算法分析 2. 直接插入排序代码3. 直接插入排序时间复杂度4. 折半插入排序5. 折半插入排序代码 总结 前言 排序的基本概念数据结构稳…

从数字化到智能化再到智慧化,智慧公厕让城市基础配套更“聪明”

随着科技的迅猛发展&#xff0c;城市生活方式与配置设施的方方面&#xff0c;面也在不断的改变和升级。智慧公厕作为城市基础配套设施的一部分&#xff0c;从数字化到智能化再到智慧化&#xff0c;正逐渐展现出其独特的魅力和优势。实现了公共厕所建设、使用与管理方式的全面变…

【AI】机器学习——支持向量机(非线性及分析)

5. 支持向量机(线性SVM) 文章目录 5.4 非线性可分SVM5.4.1 非线性可分问题处理思路核技巧核函数特点 核函数作用于SVM 5.4.2 正定核函数由 K ( x , z ) K(x,z) K(x,z) 构造 H \mathcal{H} H 空间步骤 常用核函数 5.5 SVM参数求解算法5.6 SVM与线性模型关系 5.4 非线性可分SVM …

奇偶数之和

任务描述 本关任务&#xff1a;请编一个函数fun(int *a,int n,int *odd,int *even)&#xff0c;函数的功能是分别求出数组a中所有奇数之和以及所有偶数之和。形参n给出数组中数据的个数&#xff1b;利用指针odd返回奇数之和&#xff0c;利用指针even返回偶数之和。 例如&#…

UE5_OpenCV库的加载方式

UE5使用opencv库要在系统中添加opencv的环境变量 在项目文件夹下新建ThirdParty,将OpenCV中的bin、opencv文件夹copy到ThirdParty中 打开项目,找到source目录下的build.cs文件 修改build.cs内容,添加头文件路径,dll路径,lib路径 // Copyright Epic Games, Inc. All Right…

leetcode21

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

腾讯mini项目-【指标监控服务重构】2023-07-21

今日已办 当在Docker容器中运行程序时&#xff0c;可能会遇到使用os.Getpid()函数时出现异常的情况。这是因为Docker容器中的进程隔离机制与宿主机器不同&#xff0c;容器内部的进程可能无法访问宿主机器的进程信息。 要解决这个问题&#xff0c;可以尝试&#xff1a; 使用do…

Linux磁盘管理:最佳实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

每日一博 - 防范彩虹表攻击_数据库存储密码的秘密武器

文章目录 概述图解小结 概述 加盐&#xff08;salting&#xff09;是一种安全存储数据库中密码并验证其真实性的常见方法&#xff0c;它的主要目的是增加密码的安全性&#xff0c;以防止常见的密码攻击&#xff0c;如彩虹表攻击。以下是关于如何使用加盐技术的简要介绍&#x…