使用tui-image-editor 图片编辑 标注图片

news2024/11/19 13:13:39

需求背景

鼠标悬浮在图片上 出现编辑按钮 点击编辑 对该图片进行编辑(输入文案、涂鸦、标记、裁剪等)

可以体验一下它线上编辑器

Image-editor | TOAST UI :: Make Your Web Delicious!

使用

  • 首先在你的前端项目中安装:
npm i tui-image-editor
// or
yarn add tui-image-editor

我是封装成一个单独的组件 使用的时候直接引入就行

  • 新建一个.vue文件
  • <template>
      <div class="container">
        <div id="tui-image-editor"></div>
        <div slot="footer" class="dialog-footer">
          <el-button size="mini" @click="close">取消</el-button>
          <el-button size="mini" type="primary" @click="uploadImg">完成并保存</el-button>
        </div>
      </div>
      <!-- <el-dialog append-to-body :visible.sync="editor" :before-close="closeFun" title="详情" top="0" width="95%">
        <div class="container">
          <div id="tui-image-editor"></div>
        </div>
        <span slot="footer" class="dialog-footer">
          <el-button size="mini">下载</el-button>
          <el-button size="mini">保存至服务器</el-button>
        </span>
      </el-dialog> -->
    </template>
    <script>
    import {getSubToken} from '@/api/index'
    import 'tui-image-editor/dist/tui-image-editor.css';
    import 'tui-color-picker/dist/tui-color-picker.css';
    const ImageEditor = require('tui-image-editor');
    const localeZh = {
      // override default English locale to your custom
      Crop: '裁剪',
      DeleteAll: '全部删除',
      Delete: '删除',
      Undo: '撤销',
      Redo: '反撤销',
      Reset: '重置',
      Flip: '镜像',
      Rotate: '旋转',
      Draw: '画',
      Shape: '形状标注',
      Icon: '图标标注',
      Text: '文字标注',
      Mask: '遮罩',
      Filter: '滤镜',
      Bold: '加粗',
      Italic: '斜体',
      Underline: '下划线',
      Left: '左对齐',
      Center: '居中',
      Right: '右对齐',
      Color: '颜色',
      'Text size': '字体大小',
      Custom: '自定义',
      Square: '正方形',
      Apply: '应用',
      Cancel: '取消',
      'Flip X': 'X 轴',
      'Flip Y': 'Y 轴',
      Range: '区间',
      Stroke: '描边',
      Fill: '填充',
      Circle: '圆',
      Triangle: '三角',
      Rectangle: '矩形',
      Free: '曲线',
      Straight: '直线',
      Arrow: '箭头',
      'Arrow-2': '箭头2',
      'Arrow-3': '箭头3',
      'Star-1': '星星1',
      'Star-2': '星星2',
      Polygon: '多边形',
      Location: '定位',
      Heart: '心形',
      Bubble: '气泡',
      'Custom icon': '自定义图标',
      'Load Mask Image': '加载蒙层图片',
      Grayscale: '灰度',
      Blur: '模糊',
      Sharpen: '锐化',
      Emboss: '浮雕',
      'Remove White': '除去白色',
      Distance: '距离',
      Brightness: '亮度',
      Noise: '噪音',
      'Color Filter': '彩色滤镜',
      Sepia: '棕色',
      Sepia2: '棕色2',
      Invert: '负片',
      Pixelate: '像素化',
      Threshold: '阈值',
      Tint: '色调',
      Multiply: '正片叠底',
      Blend: '混合色'
      // etc...
    };
    const customTheme = {
      // image 坐上角度图片
      'common.bi.image': '', // 在这里换上你喜欢的logo图片
      'common.bisize.width': '0px',
      'common.bisize.height': '0px',
      'common.backgroundImage': 'none',
      'common.backgroundColor': '#f3f4f6',
      'common.border': '1px solid #444',
    
      // header
      'header.backgroundImage': 'none',
      'header.backgroundColor': '#f3f4f6',
      'header.border': '0px',
      'header.display': 'none',
    
      // load button
      'loadButton.backgroundColor': '#fff',
      'loadButton.border': '1px solid #ddd',
      'loadButton.color': '#222',
      'loadButton.fontFamily': 'NotoSans, sans-serif',
      'loadButton.fontSize': '12px',
      'loadButton.display': 'none', // 可以直接隐藏掉
    
      // download button
      'downloadButton.backgroundColor': '#fdba3b',
      'downloadButton.border': '1px solid #fdba3b',
      'downloadButton.color': '#fff',
      'downloadButton.fontFamily': 'NotoSans, sans-serif',
      'downloadButton.fontSize': '12px',
      'downloadButton.display': 'none', // 可以直接隐藏掉
    
      // icons default
      'menu.normalIcon.color': '#8a8a8a',
      'menu.activeIcon.color': '#555555',
      'menu.disabledIcon.color': '#434343',
      'menu.hoverIcon.color': '#e9e9e9',
      'submenu.normalIcon.color': '#8a8a8a',
      'submenu.activeIcon.color': '#e9e9e9',
    
      'menu.iconSize.width': '24px',
      'menu.iconSize.height': '24px',
      'submenu.iconSize.width': '32px',
      'submenu.iconSize.height': '32px',
    
      // submenu primary color
      'submenu.backgroundColor': '#1e1e1e',
      'submenu.partition.color': '#858585',
    
      // submenu labels
      'submenu.normalLabel.color': '#858585',
      'submenu.normalLabel.fontWeight': 'lighter',
      'submenu.activeLabel.color': '#fff',
      'submenu.activeLabel.fontWeight': 'lighter',
    
      // checkbox style
      'checkbox.border': '1px solid #ccc',
      'checkbox.backgroundColor': '#fff',
    
      // rango style
      'range.pointer.color': '#fff',
      'range.bar.color': '#666',
      'range.subbar.color': '#d1d1d1',
    
      'range.disabledPointer.color': '#414141',
      'range.disabledBar.color': '#282828',
      'range.disabledSubbar.color': '#414141',
    
      'range.value.color': '#fff',
      'range.value.fontWeight': 'lighter',
      'range.value.fontSize': '11px',
      'range.value.border': '1px solid #353535',
      'range.value.backgroundColor': '#151515',
      'range.title.color': '#fff',
      'range.title.fontWeight': 'lighter',
    
      // colorpicker style
      'colorpicker.button.border': '1px solid #1e1e1e',
      'colorpicker.title.color': '#fff'
    };
    export default {
      props: ['editor', 'editImgUrl', 'editFile'],
      watch: {
        'editImgUrl': {
          deep: true,
          handler: function (newVal, oldVal) {
            console.log(newVal, oldVal, '000000000000000')
          }
        }
      },
      data () {
        return {
          instance: null
        };
      },
      mounted () {
        this.init()
      },
      methods: {
        init () {
          this.instance = new ImageEditor(
            document.querySelector('#tui-image-editor'),
            {
              includeUI: {
                loadImage: {
                  path: this.editImgUrl,
                  name: 'image'
                },
                initMenu: 'draw',
                menu: [
                  'crop', // 裁切
                  'draw', // 添加绘画
                  'text', // 添加文本
                  'rotate', // 旋转
                  'flip' // 翻转
                  // 'shape', // 添加形状
                  // 'icon', // 添加图标
                  // 'mask', // 添加覆盖
                  // 'filter' // 添加滤镜
                ],
                menuBarPosition: 'bottom',
                locale: localeZh,
                theme: customTheme,
                cssMaxWidth: 800,
                cssMaxHeight: 500
              }
            }
          );
          document.getElementsByClassName('tui-image-editor-main')[0].style.top = 0;
          // document.querySelector('[tooltip-content="ZoomIn"]').style.display = 'none' // 放大
          // document.querySelector('[tooltip-content="ZoomOut"]').style.display = 'none' // 缩小
          document.querySelector('[tooltip-content="Hand"]').style.display = 'none' // 拖动界面
          document.querySelector('[tooltip-content="History"]').style.display = 'none'
          document.querySelector('.tie-btn-deleteAll').style.display = 'none' // 清空
        },
        uploadImg () {
          const base64String = this.instance.toDataURL();
          const data = window.atob(base64String.split(',')[1]);
          const ia = new Uint8Array(data.length);
          for (let i = 0; i < data.length; i++) {
            ia[i] = data.charCodeAt(i);
          }
          const blob = new Blob([ia], { type: 'image/png' });
          var abc = new File([blob], this.editFile.fileName, {type: 'image/png', lastModified: Date.now()});
          const file = new FormData();
          console.log(abc)
          file.append('file', abc);
          // axios请求代码...
        },
        close () {
          this.$emit('close')
        }
      }
    };
    </script>
    
    <style lang="scss" scoped>
    .container {
      height: 100%;
      text-align: left;
    }
    .dialog-footer{
      position: absolute;
      bottom: 8px;
      right: 10px;
    }
    </style>
    

    默认的样式如下

说明:直接按照官方的 有很多东西是我们不需要的比如上面的logo 和右上角的按钮  可以通过自定义样式去掉 参考代码里的customTheme 还有官方的提示都是英文的 所以需要汉化 参考代码里的localeZh

调整完之后

引用组件

import tuiImageEditor from '../../tuiImageEditor';
components: { tuiImageEditor },
<el-dialog class="body" append-to-body :visible.sync="editor" :before-close="close" title="编辑" top="0" width="95%">
      <tui-image-editor ref="tuiImageEditor" :editor="editor" :editImgUrl='editImgUrl' :editFile="editFile"
        @close="close" @uploadImg="uploadImg"></tui-image-editor>
    </el-dialog>

有很多涉及传值的地方 可以根据自己项目的场景删掉或者替换

到这里就差不多可以了 说下我遇到的问题

1.刚开始的时候 我的悬浮气泡里文字样式错位 我自己重新安装了一下 就又好了 

2.我的需求是在弹窗内编辑 所以理所当然的是把这个编辑器放在弹窗里再装成组件之后 但是引入后 就报错 不知道啥原因 所以我就在引入组件的时候 用弹窗包起来 大家如果有知道原因的 欢迎评论区留言

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

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

相关文章

Spring Boot 中的 Sleuth 详解

Spring Boot 中的 Sleuth 是一个用于分布式追踪的库&#xff0c;它可以帮助你追踪和理解分布式系统中的请求如何跨越多个服务和网络调用。通过使用 Sleuth&#xff0c;你可以收集关于请求路径、延迟、异常等的信息&#xff0c;从而更容易地诊断问题并进行性能优化。 一、下面是…

chown: changing ownership of ‘.‘: Permission denied 的一种解法

前言 最近在新电脑用 colima docker 启动服务遇到了这样的报错 chown: changing ownership of .: Permission denied在网上搜索了很久&#xff0c;不管是google还是stack overflow都没有突破口&#xff0c;只要绑定了 volumes 就会报错&#xff0c;按照网上说的方法&#xff…

分布式协议笔记

目录 一致性协议 2pc 3pc CanCommit PreCommit doCommit 回滚 3PC的优点和缺陷 paxos算法 一、Paxos算法背景 二、Paxos算法流程 Paxos算法实例1 Paxos算法实例2 Paxos算法实例3 三、Multi-Paxos算法 附Paxos算法推导过程 raft 概念介绍 算法步骤 Leader选…

css实现高度是宽度一半的效果

1、方法一&#xff1a;使用变量:root、var()、clac()实现&#xff1a; 1.1 效果如下&#xff1a; 2.2 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title>&l…

AMEYA360:稳先微汽车驱动芯片—智能高边开关WS7系列

近几年&#xff0c;新能源汽车高速发展&#xff0c;用车浪潮蔓延全球&#xff0c;我国新能源汽车占有量连续9年居全球前列&#xff0c;2023年全年市占率达37.7%&#xff0c;市场规模可观&#xff0c;并显现出以下特点&#xff1a;电车产品对比油车优势明显、消费者接受度高、市…

KNN算法对鸢尾花进行分类:添加网格搜索和交叉验证

优化——添加网格搜索和交叉验证 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection imp…

DevOps-SonarQube整合Jenkins

下载SonarQube Scanner 登录Jenkins服务器&#xff0c;下载SonarQube Scanner wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip安装unzip&#xff0c;需要通过它来解压zip压缩包 yum install -y unzip解压So…

详解MySQL的MVCC(ReadView部分解析C++源码)

文章目录 1. 什么是MVCC2. MVCC核心组成&#xff08;三大件&#xff09;2.1 MVCC为什么需要三大件 3. 隐藏字段4. undo log4.1 模拟版本链数据形成过程 5. Read View5.1 m_ids5.2 m_creator_trx_id5.3 m_low_limit_id5.4 m_up_limit_id5.5 可见性分析算法 6. MVCC流程模拟6.1 R…

三、NLP中的句子关系判断

句子关系判断是指判断句子是否相似&#xff0c;是否包含&#xff0c;是否是问答关系等&#xff0c;常应用在文本去重、检索&#xff08;用户输入和文档的相关性&#xff09;、推荐&#xff08;和用户喜好文章是否相似&#xff09;等场景中。 3.0、文本相似度计算 3.0.0 传统机…

白嫖AWS云服务器,验证、注册指南

背景 不知道你想不想拥有一台属于自己的云服务器呢&#xff0c;拥有一台自己的云服务器可以建站&#xff0c;可以在上面搭建个人博客&#xff0c;今天我就来教大家如何申请亚马逊 AWS 免费云服务器&#xff0c;这个云服务器可以长达12个月的免费。而且到期后可以继续换个账号继…

Vulnhub - DC-1

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog DC-1 靶机下载地址&#xff1a;DC: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机&#xff0c;发现开…

OPENCV(0-1之0.2)

OPENCV-0.2 学习安排图像基础像素访问和修改像素值 色彩空间转换RGB到灰度的转换RGB到HSV的转换 图像操作裁剪缩放旋转和翻转 图像滤波平滑和模糊图像边缘检测 图像变换仿射变换透视变换 总结 官方文档 学习安排 图像基础 像素&#xff1a;了解像素的概念&#xff0c;包括像素…

Filebeat(Beats)详细介绍与使用

1. 什么是 Beats? Beats 是开源数据传送器&#xff0c;将其作为代理安装在服务器上&#xff0c;以将操作数据发送到 Elasticsearch。 Elastic提供Beats用于捕获&#xff1a; 审核数据&#xff1a;Auditbeat 日志文件和日志&#xff1a;Filebeat 云数据&#xff1a;Functio…

【物联网学习笔记】CubeMx6.10+STM32F407ZGT6+LWIP最最最基础配置

使用正点原子探索者开发板 板载芯片&#xff1a;STM32F407ZGT6 PHY芯片&#xff1a;LAN8720 LWIP版本&#xff1a;2.1.2 本次目标&#xff1a;先ping通开发板再说&#xff01; 文章目录 一、CubeMX配置1、时钟配置2、ETH配置3、LWIP配置4、添加LAN8720的复位引脚 二、Keil工…

单链表——增删查改

本节复习链表的增删查改 首先&#xff0c; 链表不是连续的&#xff0c; 而是通过指针联系起来的。 如图&#xff1a; 这四个节点不是连续的内存空间&#xff0c; 但是彼此之间使用了一个指针来连接。 这就是链表。 现在我们来实现链表的增删查改。 目录 单链表的全部接口…

JVM之调优(一)

背景&#xff1a;生产环境由于堆内存较大&#xff0c;fullgc 垃圾回收导致程序卡顿问题&#xff08;假死&#xff09; 目录 一、程序卡顿导致的影响 前端页面空白后端数据重复 二、解决方法 降低堆内存大小使用合适的垃圾回收器&#xff08;可以尝试&#xff0c;还未进行测试…

【毕设级项目】基于嵌入式的智能家居控制板(完整工程资料源码)

基于嵌入式的智能家居控制板演示效果 基于嵌入式的智能家居控制板 前言&#xff1a; 随着科技的不断进步&#xff0c;物联网技术得到了突飞猛进的发展。智能家居是物联网技术的典型应用领域之一。智能家居系统将独立家用电器、安防设备连接成一个具有思想的整体&#xff0c;实现…

Android Studio入门——页面跳转

1.工程目录 2.MainActivity package com.example.demo01;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCo…

数据集成工具 ---- datax 3.0

1、datax: 是一个异构数据源离线同步工具&#xff0c;致力于实现关系型数据库&#xff08;mysql、oracle等&#xff09;hdfs、hive、hbase等各种异构数据源之间的数据同步 2、参考网址文献&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.mdhttps:/…

pycharm配置解释器

pycharm配置解释器 1.mac配置解释器 1.mac配置解释器