关于tui-image-editor在vue项目中的使用

**应用于前台页面的图片编辑器、方便、快捷、简单好用、(裁剪、涂鸦、标注、旋转、滤镜...)

安装:**

    npm i tui-image-editor

    yarn add tui-image-editor

由于是老外开发的,默认的文字描述都是英文,这里我们需要先汉化一下:

    const locale_zh = {

      ZoomIn: "放大",

      ZoomOut: "缩小",

      ...

    },

效果如下:

**自定义样式:**

默认风格为暗黑系,如果想改成白底,或者想改变按钮的大小、颜色等样式,可以使用自定义样式。

    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",

      ...},

使用如下:

    this.instance = new ImageEditor(

      document.querySelector("#tui-image-editor"),

      {

        includeUI: {

          loadImage: {

            path: "https://img1.baidu.com/it/u=4131209051,1689521986&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500",

            name: "image",

          },

          initMenu: "draw", // 默认打开的菜单项

          menuBarPosition: "bottom", // 菜单所在的位置

          locale: locale_zh, // 本地化语言为中文

          theme: customTheme, // 自定义样式

        },

        cssMaxWidth: 1000, // canvas 最大宽度

        cssMaxHeight: 600, // canvas 最大高度

      }

    );

**以下是调整显示样式以及调整画笔颜色为黑色,虽然写入的是红色**

    document.getElementsByClassName("tui-image-editor-main")[0].style.top ="45px"; // 调整图片显示位置

    document.getElementsByClassName("tie-btn-reset tui-image-editor-item help")[0].style.display = "none"; // 隐藏顶部重置按钮

    document.getElementsByClassName("tui-image-editor-button line")[0].style.display = "none"; // 隐藏直线

    document.getElementsByClassName("tie-draw-color tui-image-editor-button")[0].style.display = "none"; // 隐藏颜色

    document.getElementsByClassName("tui-image-editor-partition")[0].style.display = "none"; // 隐藏颜色

    _that.instance.ui.draw.color = "red";

**为了保证与后端交互所需要的图片格式为黑底白色涂鸦部分的图片,做出以下更改:**

思路:

1、得到上传或者选择的图片数据格式,先处理成4个为一组的数组数据,然后再来解析改变数值为0的改为其他相近值,然后重新生成canvas

2、在重新绘制后就可以开始涂鸦了

2、得到涂鸦后的图片后,再次获取图片数据,先获取不为0的数值改为0黑色,为0的数值给为255白色,然后重新生成canvas就可以得到想要的图片。

以下是需要的方法:

      // 获取到图片的一维数组

      getImageData(dom, url) {

          const ctx = dom.getContext("2d"); // 设置在画布上绘图的环境

          const image = new Image();

          image.src = url;

          //获取画布宽高

          const w = dom.width;

          const h = dom.height;

          return new Promise((resolve) => {

            image.onload = function () {

              ctx.drawImage(image, 0, 0, w, h); // 将图片绘制到画布上

              const imgData = ctx.getImageData(0, 0, w, h); // 获取画布上的图像像素

              resolve(imgData.data); // 获取到的数据为一维数组,包含图像的RGBA四个通道数据

              ctx.clearRect(0, 0, w, h);

            };

          });

        },

        // 转化成多维数组

        normalize(data, width, height) {

          const list = [];

          const result = [];

          const len = Math.ceil(data.length / 4);

          // 将每一个像素点的rgba四个值组合在一起

          for (let i = 0; i < len; i++) {

            const start = i * 4;

            list.push([

              data[start],

              data[start + 1],

              data[start + 2],

              data[start + 3],

            ]);

          }

          //根据图形的宽和高将数据进行分类

          for (let hh = 0; hh < height; hh++) {

            const tmp = [];

            for (let ww = 0; ww < width; ww++) {

              tmp.push(list[hh * width + ww]);

            }

            result.push(tmp);

          }

          return result;

        },

        // 在保存时改变图形的颜色(黑色、白色)

        peeling(data, w, h) {

          data = this.normalize(data, w, h); // 转化成多维数组

          // 将黑色变成白色 (0,0,0) -> (255,255,255)

          for (let i = 0; i < data.length; i++) {

            for (let j = 0; j < data[i].length; j++) {

              //排除透明度的比较

              if (data[i][j].slice(0, 3).join("") != "000") {

                data[i][j] = [0, 0, 0, data[i][j][3]];

              } else {

                data[i][j] = [255, 255, 255, data[i][j][3]];

              }

            }

          }

          return this.restoreData(data); // 转化成一维数组

        },

        // 在上传或者选择图片时改变颜色(将黑色改成相近颜色)

        peeling1(data, w, h) {

          data = this.normalize(data, w, h); // 转化成多维数组

          // 将黑色变成相近颜色 (0,0,0) -> (10, 10, 10)

          for (let i = 0; i < data.length; i++) {

            for (let j = 0; j < data[i].length; j++) {

              //排除透明度的比较

              if (data[i][j].slice(0, 3).join("") == "000") {

                data[i][j] = [10, 10, 10, data[i][j][3]];

              }

            }

          }

          return this.restoreData(data); // 转化成一维数组

        },

        // 重新转化成一维数组

        restoreData(data) {

          const result = [];

          for (let i = 0; i < data.length; i++) {

            for (let j = 0; j < data[i].length; j++) {

              result.push(

                data[i][j][0],

                data[i][j][1],

                data[i][j][2],

                data[i][j][3]

              );

            }

          }

          return result;

        },

        //最后重新渲染到画图之后,并且dom为当前图片需要的dom,得到宽高,而不是canvas本身的宽高

        drawImage(dom, data) {

          const ctx = dom.getContext("2d");

          const matrix_obj = ctx.createImageData(dom.width, dom.height);

          matrix_obj.data.set(data);

          ctx.putImageData(matrix_obj, 0, 0);

        },

以上就是所有使用啦~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容