| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- <template>
- <div ref="editor"></div>
- </template>
- <script setup>
- import {useTemplateRef, onMounted, onUnmounted} from 'vue'
- import ImageEditor from 'tui-image-editor';
- import 'tui-color-picker/dist/tui-color-picker.css';
- import 'tui-image-editor/dist/tui-image-editor.css';
- const props = defineProps({
- // includeUi: {
- // type: Boolean,
- // default: true,
- // },
- // /**
- // * @see https://nhn.github.io/tui.image-editor/latest/ImageEditor
- // */
- // options: {
- // type: Object,
- // default() {
- // return {
- // cssMaxWidth: 700,
- // cssMaxHeight: 900,
- // };
- // },
- // },
- // 图片地址
- image_url: String,
- });
- const includeUIOptions = {
- includeUI: {
- initMenu: 'filter',
- },
- };
- const editor = useTemplateRef('editor');
- // 编辑器实例
- let editorInstance = null;
- const addEventListener = () => {
- // Object.keys(this.$listeners).forEach((eventName) => {
- // editorInstance.on(eventName, (...args) => this.$emit(eventName, ...args));
- // });
- }
- const getRootElement = () => {
- return editor.value;
- }
- const invoke = (methodName, ...args) => {
- let result = null;
- if (editorInstance[methodName]) {
- result = editorInstance[methodName](...args);
- } else if (methodName.indexOf('.') > -1) {
- const func = getMethod(editorInstance, methodName);
- if (typeof func === 'function') {
- result = func(...args);
- }
- }
- return result;
- }
- const getMethod = (instance, methodName) => {
- const { first, rest } = parseDotMethodName(methodName);
- const isInstance = instance.constructor.name !== 'Object';
- const type = typeof instance[first];
- let obj;
- if (isInstance && type === 'function') {
- obj = instance[first].bind(instance);
- } else {
- obj = instance[first];
- }
- if (rest.length > 0) {
- return getMethod(obj, rest);
- }
- return obj;
- }
- const parseDotMethodName = (methodName) => {
- const firstDotIdx = methodName.indexOf('.');
- let firstMethodName = methodName;
- let restMethodName = '';
- if (firstDotIdx > -1) {
- firstMethodName = methodName.substring(0, firstDotIdx);
- restMethodName = methodName.substring(firstDotIdx + 1, methodName.length);
- }
- return {
- first: firstMethodName,
- rest: restMethodName,
- };
- }
- const zh_local = {
- 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: '下载图片'
- };
- const theme = {
- // // 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',
- // // 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',
- // -----------------------
- // // 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",
- // -----------------------
- "common.bi.image": "", // 左上角logo图片
- "common.bisize.width": "0px",
- "common.bisize.height": "0px",
- "common.backgroundImage": "none",
- "common.backgroundColor": "#f3f4f6",
- "common.border": "1px solid #333",
- // header
- "header.backgroundImage": "none",
- "header.backgroundColor": "#f3f4f6",
- "header.border": "0px",
-
- // 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": "#ccc",
- "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",
- };
- onMounted(() => {
- // let options = props.options;
- // if (props.includeUi) {
- // options = Object.assign(includeUIOptions, props.options);
- // }
- // options.includeUI.locale = zh_local;
- // options.includeUI.theme = theme;
- const opts = {
- includeUI: {
- loadImage: {
- // path: "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c1d7a1feb60346449c1a64893888989a~tplv-k3u1fbpfcp-watermark.image",
- // path: 'http://localhost/src/assets/slider/logo.jpg',
- path: props.image_url,
- name: "image",
- },
- initMenu: "draw", // 默认打开的菜单项
- menuBarPosition: "bottom", // 菜单所在的位置
- locale: zh_local, // 本地化语言为中文
- theme: theme
- },
- cssMaxWidth: 1000, // canvas 最大宽度
- cssMaxHeight: 600, // canvas 最大高度
- }
- editorInstance = new ImageEditor(editor.value, opts);
- addEventListener();
- });
- onUnmounted(() => {
- // Object.keys(this.$listeners).forEach((eventName) => {
- // editorInstance.off(eventName);
- // });
- editorInstance.destroy();
- editorInstance = null;
- });
- </script>
- <style>
- .image-editor-body .tui-image-editor{
- top: 0 !important;
- }
- </style>
|