Explorar el Código

增加tui-image-editor插件

qinpeng hace 2 años
padre
commit
9287955d3b
Se han modificado 4 ficheros con 830 adiciones y 51 borrados
  1. 610 37
      package-lock.json
  2. 1 0
      package.json
  3. 21 0
      src/api/api.js
  4. 198 14
      src/views/CalligraphyMaster/cread.vue

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 610 - 37
package-lock.json


+ 1 - 0
package.json

@@ -31,6 +31,7 @@
         "script-ext-html-webpack-plugin": "^2.1.5",
         "script-loader": "^0.7.2",
         "tinymce": "^5.7.1",
+        "tui-image-editor": "^3.15.3",
         "vue": "^2.6.11",
         "vue-i18n": "^8.24.5",
         "vue-pdf": "^4.2.0",

+ 21 - 0
src/api/api.js

@@ -1,6 +1,27 @@
 import request from "../utils/request"
 import Cookies from "js-cookie";
 import { getToken } from "@/utils/auth"
+
+// 文件流 /GCLSFileServer/WebFileDownload?
+export function WebFileDownload(data) {
+    let userInfor = getToken();
+    let UserCode = '',
+        UserType = '',
+        SessionID = ''
+    if (userInfor) {
+        let user = JSON.parse(getToken());
+        UserCode = user.user_code;
+        UserType = user.user_type;
+        SessionID = user.session_id;
+    }
+    return request({
+        url: `/GCLSFileServer/WebFileDownload?UserCode=${UserCode}&UserType=${UserType}&SessionID=${SessionID}`,
+        method: 'get',
+        responseType:'blob',
+        params: data
+    })
+}
+
 let userInfor = getToken()
 let UserCode = '',
     UserType = '',

+ 198 - 14
src/views/CalligraphyMaster/cread.vue

@@ -202,15 +202,15 @@
               changeType == 'text' || changeType == 'luminance' ? 0 : '32px',
           }"
         >
-          <canvas
-            id="canvas"
+          <div
+            id="imgCanvas"
             ref="imgCanvas"
             :style="{
               width: form.width + 'px',
               height: form.height + 'px',
               background: form.bg_color,
             }"
-          ></canvas>
+          ></div>
         </div>
         <div class="bottom">
           <div>
@@ -257,6 +257,164 @@
 import Header from "@/components/Header";
 import DragLine from "@/components/DragLine";
 import { getToken, removeToken } from "@/utils/auth";
+import { WebFileDownload } from "@/api/api";
+
+import "tui-image-editor/dist/tui-image-editor.css";
+import "tui-color-picker/dist/tui-color-picker.css";
+import ImageEditor from "tui-image-editor";
+
+const locale_zh = {
+  ZoomIn: "放大",
+  ZoomOut: "缩小",
+  Hand: "手掌",
+  History: "历史",
+  Resize: "调整宽高",
+  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: "混合色",
+  Width: "宽度",
+  Height: "高度",
+  "Lock Aspect Ratio": "锁定宽高比例",
+};
+
+const customTheme = {
+  "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",
+};
 
 export default {
   //import引入的组件需要注入到对象中才能使用
@@ -441,21 +599,47 @@ export default {
       }
     },
     initCanvasImage() {
-      let imgCanvas = this.$refs.imgCanvas; //绘制图片的canvas
-      this.imgCtx = imgCanvas.getContext("2d");
-      let img = new Image();
-      img.src = this.fileList[0].file_url;
-      img.onload = () => {
-        //图片加载完成后开始绘制图片
-        this.imgCtx.drawImage(img, 0, 0, this.form.width, this.form.height);
-      };
+      this.loading = this.$loading({
+        lock: true,
+        text: "Loading",
+        spinner: "el-icon-loading",
+        background: "rgba(0, 0, 0, 0.7)",
+      });
+      // 直接使用跨域  请求文件流转url 再使用
+      WebFileDownload({
+        FileID: this.fileList[0].file_id,
+      }).then((res) => {
+        const objectUrl = window.URL.createObjectURL(res);
+        this.instance = new ImageEditor(document.querySelector("#imgCanvas"), {
+          includeUI: {
+            loadImage: {
+              path: objectUrl,
+              name: "image",
+            },
+            menu: [
+              "resize",
+              "crop",
+              "rotate",
+              "draw",
+              "shape",
+              "icon",
+              "text",
+              "filter",
+            ], // 底部菜单按钮列表 隐藏镜像flip和遮罩mask
+            initMenu: "draw", // 默认打开的菜单项
+            menuBarPosition: "bottom", // 菜单所在的位置
+            locale: locale_zh, // 本地化语言为中文
+            theme: customTheme, // 自定义样式
+          },
+          cssMaxWidth: this.form.width, // canvas 最大宽度
+          cssMaxHeight: this.form.heigt, // canvas 最大高度
+        });
+        this.loading.close();
+      });
     },
     // 删除上传的图片
     deleteImage() {
       this.fileList = [];
-      let imgCanvas = this.$refs.imgCanvas; //绘制图片的canvas
-      this.imgCtx = imgCanvas.getContext("2d");
-      this.imgCtx.clearRect(0, 0, this.form.width, this.form.height);
     },
     handlebeforeUplaod(file) {
       if (file.size > 20 * 1024 * 1024) {

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio