vue图片编辑插件tui-image-editor踩坑记录

6,265 阅读2分钟

最近有一个新需求 要编辑图片 类似于美图秀秀可以插入图层文字说明裁剪什么的

搜遍全网找到了这么一个插件叫 tui-image-editor ;

官方文档链接:www.npmjs.com/package/tui…

API链接:nhn.github.io/tui.image-e…(纯英文预警)

话不多说 开干

下载

npm i tui-image-editor
// or
yarn add tui-image-editor

引入

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 locale_zh = {
    // override default English locale to your custom
    Crop: "裁剪",
    Load: '替换图片',
    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: "混合色",
    Double: '双击',
    Download: '预览图片'


    // 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.margin": "0px auto",

    // load button
    "loadButton.backgroundColor": "#fff",
    "loadButton.border": "1px solid #ddd",
    "loadButton.color": "#222",
    "loadButton.fontFamily": "NotoSans, sans-serif",
    "loadButton.fontSize": "12px",
    // "loadButton.width": "150px",
    // "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"
};

使用

我这里的需求是点编辑弹框然后操作图片

//html
<button class="move_group" @click="editPic" ref="modify">编辑</button>
<el-dialog title="素材编辑" :modal-append-to-body="false" :append-to-body="true" :visible.sync="editImgDialogVisible" custom-class="edit_image_dialog" width="1000px" :close-on-click-modal="false" @close="closeEditGroupItem">
     <div style="padding:20px">
          <div id="tui-image-editor"></div>
     </div>
     <span slot="footer" class="dialog-footer" style="margin-top:-20px">
     <el-button @click="editImgDialogVisible = false">取 消</el-button>
          <el-button type="primary" @click="uploadEditImg">完 成</el-button>
     </span>
</el-dialog>

//js
data(){
	return {
  	instance:null
  }
},
methods:{
	editPic () {
            this.$nextTick(() => {
                this.instance = new ImageEditor(document.querySelector('#tui-image-editor'), {
                    usageStatistics: false,//这个一定要写要不然会报错
                    includeUI: {
                        loadImage: {
                            path: url,//加载的图片链接
                            name: 'image',//图片名称(不重要)
                        },
                        //操作菜单栏
                        menu: [
                            "crop", // 裁切
                            "flip", // 翻转
                            "rotate", // 旋转
                            "draw", // 添加绘画
                            "shape", // 添加形状
                            // "icon", // 添加图标
                            "text", // 添加文本
                            "mask", // 添加覆盖
                            "filter", // 添加滤镜
                        ],
                        menuBarPosition: "top",//操作栏位置
                        locale: locale_zh,//语言
                        theme: customTheme,//主题样式
                    },
                    // cssMaxWidth: 700,//宽
                    // cssMaxHeight: 900,//高
                })
            })
        },
}

这样基本上就完成了开始操作图片就好了

界面就是这个样子的

然后!!有一个大坑!

添加遮罩图片的时候点半天点不到

就是这个鬼东西 点了没反应

我去研究了一上午的文档也没有相关的说明

然后我就打开f12看了一下dom

这个东西 没有宽高 所以点不到……

所以只要在样式里加上个display:block就好了……

.tui-image-editor-submenu-item > li > .tui-image-editor-button > div > .tie-mask-image-file {
    display: block !important;
}

保存图片

然后操作完就是保存图片啦

//将编辑图片转为base64文件流并上传
uploadEditImg () {
            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 file = new File([ia], 图片名称, { "type": "image/png" });
            const fd = new FormData();
            fd.append("file", file);
            fd.append("groupId", this.editGroupId);
            fd.append("type", 4);
            editResource(fd).then(res => {
                this.editImgDialogVisible = false
                this.$message({
                    message: '编辑成功',
                    type: 'success'
                })
                this.getList()
            })
        },

好啦 over。