|
|
@@ -2,7 +2,7 @@
|
|
|
<div ref="editor"></div>
|
|
|
</template>
|
|
|
<script setup>
|
|
|
-import {useTemplateRef, onMounted, onUnmounted} from 'vue'
|
|
|
+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';
|
|
|
@@ -27,13 +27,13 @@ const props = defineProps({
|
|
|
// },
|
|
|
// },
|
|
|
// 图片地址
|
|
|
- image_url: String,
|
|
|
+ image_url: String
|
|
|
});
|
|
|
|
|
|
const includeUIOptions = {
|
|
|
includeUI: {
|
|
|
- initMenu: 'filter',
|
|
|
- },
|
|
|
+ initMenu: 'filter'
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
const editor = useTemplateRef('editor');
|
|
|
@@ -41,15 +41,15 @@ const editor = useTemplateRef('editor');
|
|
|
// 编辑器实例
|
|
|
let editorInstance = null;
|
|
|
|
|
|
-const addEventListener = () => {
|
|
|
+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;
|
|
|
@@ -64,7 +64,7 @@ const invoke = (methodName, ...args) => {
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
-}
|
|
|
+};
|
|
|
|
|
|
const getMethod = (instance, methodName) => {
|
|
|
const { first, rest } = parseDotMethodName(methodName);
|
|
|
@@ -83,7 +83,7 @@ const getMethod = (instance, methodName) => {
|
|
|
}
|
|
|
|
|
|
return obj;
|
|
|
-}
|
|
|
+};
|
|
|
|
|
|
const parseDotMethodName = (methodName) => {
|
|
|
const firstDotIdx = methodName.indexOf('.');
|
|
|
@@ -97,76 +97,76 @@ const parseDotMethodName = (methodName) => {
|
|
|
|
|
|
return {
|
|
|
first: firstMethodName,
|
|
|
- rest: restMethodName,
|
|
|
+ rest: restMethodName
|
|
|
};
|
|
|
-}
|
|
|
+};
|
|
|
|
|
|
const zh_local = {
|
|
|
- Crop: "裁剪",
|
|
|
+ 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: "混合色",
|
|
|
+ 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: '下载图片'
|
|
|
};
|
|
|
@@ -249,9 +249,7 @@ const theme = {
|
|
|
// 'colorpicker.button.border': '1px solid #1e1e1e',
|
|
|
// 'colorpicker.title.color': '#fff',
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-// -----------------------
|
|
|
+ // -----------------------
|
|
|
|
|
|
// // image 坐上角度图片
|
|
|
// "common.bi.image": "", // 在这里换上你喜欢的logo图片
|
|
|
@@ -332,104 +330,104 @@ const theme = {
|
|
|
// "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",
|
|
|
+ '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",
|
|
|
-
|
|
|
+ '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.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.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",
|
|
|
+ '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.backgroundColor': '#1e1e1e',
|
|
|
+ 'submenu.partition.color': '#858585',
|
|
|
|
|
|
// submenu labels
|
|
|
- "submenu.normalLabel.color": "#858585",
|
|
|
- "submenu.normalLabel.fontWeight": "lighter",
|
|
|
- "submenu.activeLabel.color": "#fff",
|
|
|
- "submenu.activeLabel.fontWeight": "lighter",
|
|
|
+ '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",
|
|
|
+ '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",
|
|
|
+ '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",
|
|
|
+ 'colorpicker.button.border': '1px solid #1e1e1e',
|
|
|
+ 'colorpicker.title.color': '#fff'
|
|
|
};
|
|
|
|
|
|
-function imgLoaded(url){
|
|
|
+function imgLoaded(url) {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
const img = new Image();
|
|
|
img.crossOrigin = 'Anonymous';
|
|
|
img.src = url;
|
|
|
- img.onload = function(){
|
|
|
+ img.onload = function () {
|
|
|
// 图片加载完成
|
|
|
resolve(img);
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
- img.onerror = function(e){
|
|
|
+ img.onerror = function (e) {
|
|
|
reject(e);
|
|
|
- }
|
|
|
- })
|
|
|
+ };
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
onMounted(() => {
|
|
|
- imgLoaded(props.image_url).then(img => {
|
|
|
+ imgLoaded(props.image_url)
|
|
|
+ .then((img) => {
|
|
|
const url = img.src;
|
|
|
|
|
|
const opts = {
|
|
|
@@ -439,16 +437,16 @@ onMounted(() => {
|
|
|
// path: 'http://localhost/src/assets/slider/logo.jpg',
|
|
|
path: url,
|
|
|
// path: base64,
|
|
|
- name: "image",
|
|
|
+ name: 'image'
|
|
|
},
|
|
|
- initMenu: "draw", // 默认打开的菜单项
|
|
|
- menuBarPosition: "bottom", // 菜单所在的位置
|
|
|
+ initMenu: 'draw', // 默认打开的菜单项
|
|
|
+ menuBarPosition: 'bottom', // 菜单所在的位置
|
|
|
locale: zh_local, // 本地化语言为中文
|
|
|
theme: theme
|
|
|
},
|
|
|
cssMaxWidth: 1000, // canvas 最大宽度
|
|
|
- cssMaxHeight: 600, // canvas 最大高度
|
|
|
- }
|
|
|
+ cssMaxHeight: 600 // canvas 最大高度
|
|
|
+ };
|
|
|
|
|
|
editorInstance = new ImageEditor(editor.value, opts);
|
|
|
// editorInstance.addImageObject(props.image_url).then(objectProps => {
|
|
|
@@ -458,46 +456,43 @@ onMounted(() => {
|
|
|
// console.log(err, 'error-出错了');
|
|
|
// });
|
|
|
addEventListener();
|
|
|
- }).catch(err => {
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
console.log(err, '出错了');
|
|
|
});
|
|
|
|
|
|
-
|
|
|
- // image2Base64(props.image_url).then(base64 => {
|
|
|
- // console.log(base64, 'base64 成功');
|
|
|
-
|
|
|
- // 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,
|
|
|
- // path: base64,
|
|
|
- // name: "image",
|
|
|
- // },
|
|
|
- // initMenu: "draw", // 默认打开的菜单项
|
|
|
- // menuBarPosition: "bottom", // 菜单所在的位置
|
|
|
- // locale: zh_local, // 本地化语言为中文
|
|
|
- // theme: theme
|
|
|
- // },
|
|
|
- // cssMaxWidth: 1000, // canvas 最大宽度
|
|
|
- // cssMaxHeight: 600, // canvas 最大高度
|
|
|
- // }
|
|
|
-
|
|
|
- // editorInstance = new ImageEditor(editor.value, opts);
|
|
|
- // // editorInstance.addImageObject(props.image_url).then(objectProps => {
|
|
|
- // // // https://nhn.github.io/tui.image-editor/latest/ImageEditor#addImageObject
|
|
|
- // // console.log(ojectProps.id, 'console.log(ojectProps.id);');
|
|
|
- // // }).catch(err => {
|
|
|
- // // console.log(err, 'error-出错了');
|
|
|
- // // });
|
|
|
- // addEventListener();
|
|
|
- // }).catch(err => {
|
|
|
- // console.log(err, '转base64失败');
|
|
|
- // });
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ // image2Base64(props.image_url).then(base64 => {
|
|
|
+ // console.log(base64, 'base64 成功');
|
|
|
+
|
|
|
+ // 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,
|
|
|
+ // path: base64,
|
|
|
+ // name: "image",
|
|
|
+ // },
|
|
|
+ // initMenu: "draw", // 默认打开的菜单项
|
|
|
+ // menuBarPosition: "bottom", // 菜单所在的位置
|
|
|
+ // locale: zh_local, // 本地化语言为中文
|
|
|
+ // theme: theme
|
|
|
+ // },
|
|
|
+ // cssMaxWidth: 1000, // canvas 最大宽度
|
|
|
+ // cssMaxHeight: 600, // canvas 最大高度
|
|
|
+ // }
|
|
|
+
|
|
|
+ // editorInstance = new ImageEditor(editor.value, opts);
|
|
|
+ // // editorInstance.addImageObject(props.image_url).then(objectProps => {
|
|
|
+ // // // https://nhn.github.io/tui.image-editor/latest/ImageEditor#addImageObject
|
|
|
+ // // console.log(ojectProps.id, 'console.log(ojectProps.id);');
|
|
|
+ // // }).catch(err => {
|
|
|
+ // // console.log(err, 'error-出错了');
|
|
|
+ // // });
|
|
|
+ // addEventListener();
|
|
|
+ // }).catch(err => {
|
|
|
+ // console.log(err, '转base64失败');
|
|
|
+ // });
|
|
|
});
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
@@ -511,7 +506,7 @@ onUnmounted(() => {
|
|
|
</script>
|
|
|
|
|
|
<style>
|
|
|
-.image-editor-body .tui-image-editor{
|
|
|
+.image-editor-body .tui-image-editor {
|
|
|
top: 0 !important;
|
|
|
}
|
|
|
-</style>
|
|
|
+</style>
|