>웹 프론트엔드 >View.js >강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

青灯夜游
青灯夜游앞으로
2021-11-26 19:43:257582검색

이 기사에서는 이미지에 회전, 확대/축소, 자르기, 주석 달기, 텍스트 추가 등이 가능한 강력한 Vue 이미지 편집 플러그인을 공유합니다.

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

[관련 권장 사항: "vue.js Tutorial"]

최근에 교사는 회전, 크기 조정, 자르기, 낙서 및 주석이 필요한 학생의 그림 숙제를 수정할 수 있다는 새로운 요구 사항을 제시했습니다. 사진, 텍스트 추가 등 언뜻 보면 머리카락이 많이 빠질 것 같은 느낌이 듭니다. 더블 일레븐 기간 동안 여성 티켓 구매를 방지할 수 있는 시간을 더 확보할 수 있도록 위의 기능을 수행할 수 있는 강력한 플러그인이 있습니까? 대답은 물론 그렇습니다.

효과 표시

Graffiti

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

자르기

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

주석

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

회전

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

필터

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

정말 강력하지 않나요! 이 외에도 하나씩 보여드리지 못한 기능이 많이 있습니다. 그럼 무엇을 기다리고 계시나요? 저와 함께 사용해 보세요~

Install

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

Use

빠른 경험

다음 코드를 복사하여 프로젝트에 플러그인을 도입하세요.

<template>
  <div>
    <div id="tui-image-editor"></div>
  </div>
</template>
<script>
import "tui-image-editor/dist/tui-image-editor.css";
import "tui-color-picker/dist/tui-color-picker.css";
import ImageEditor from "tui-image-editor";
export default {
  data() {
    return {
      instance: null,
    };
  },
  mounted() {
    this.init();
  },
  methods: {
    init() {
      this.instance = new ImageEditor(
        document.querySelector("#tui-image-editor"),
        {
          includeUI: {
            loadImage: {
              path: "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c1d7a1feb60346449c1a64893888989a~tplv-k3u1fbpfcp-watermark.image",
              name: "image",
            },
            initMenu: "draw", // 默认打开的菜单项
            menuBarPosition: "bottom", // 菜单所在的位置
          },
          cssMaxWidth: 1000, // canvas 最大宽度
          cssMaxHeight: 600, // canvas 最大高度
        }
      );
      document.getElementsByClassName("tui-image-editor-main")[0].style.top = "45px"; // 图片距顶部工具栏的距离
    },
  },
};
</script>

<style scoped>
.drawing-container {
  height: 900px;
}
</style>

생활 사진 편집 도구가 나타나는 것을 볼 수 있습니다. 매우 간단하지 않나요?

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

Internationalization

외국인이 개발했기 때문에 기본 텍스트 설명은 모두 영어로 되어 있습니다. 첫째:

const locale_zh = {
  ZoomIn: "放大",
  ZoomOut: "缩小",
  Hand: "手掌",
  History: &#39;历史&#39;,
  Resize: &#39;调整宽高&#39;,
  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": "锁定宽高比例",
};

this.instance = new ImageEditor(
  document.querySelector("#tui-image-editor"),
  {
    includeUI: {
      loadImage: {
        path: "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c1d7a1feb60346449c1a64893888989a~tplv-k3u1fbpfcp-watermark.image",
        name: "image",
      },
      initMenu: "draw", // 默认打开的菜单项
      menuBarPosition: "bottom", // 菜单所在的位置
      locale: locale_zh, // 本地化语言为中文
    },
    cssMaxWidth: 1000, // canvas 最大宽度
    cssMaxHeight: 600, // canvas 最大高度
  }
);

효과는 다음과 같습니다.

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

사용자 정의 스타일

기본 스타일은 흰색 배경으로 변경하거나 크기, 색상 등을 변경하려는 경우입니다. 버튼을 클릭하면 사용자 정의 스타일을 사용할 수 있습니다.

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

this.instance = new ImageEditor(
  document.querySelector("#tui-image-editor"),
  {
    includeUI: {
      loadImage: {
        path: "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c1d7a1feb60346449c1a64893888989a~tplv-k3u1fbpfcp-watermark.image",
        name: "image",
      },
      initMenu: "draw", // 默认打开的菜单项
      menuBarPosition: "bottom", // 菜单所在的位置
      locale: locale_zh, // 本地化语言为中文
      theme: customTheme, // 自定义样式
    },
    cssMaxWidth: 1000, // canvas 最大宽度
    cssMaxHeight: 600, // canvas 最大高度
  }
);

효과는 다음과 같습니다.

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

버튼 최적화

스타일을 맞춤설정하여 오른쪽 상단에 있는 로드 및 다운로드 버튼이 숨겨져 있는 것을 확인한 다음 그렇지 않은 다른 버튼을 숨깁니다. (필요한 비즈니스에 따라) 사용하고 이미지를 저장하는 버튼을 추가합니다.

<template>
  <div>
    <div id="tui-image-editor"></div>
    <el-button type="primary" size="small" @click="save">保存</el-button>
  </div>
</template>

// ...
methods: {
  init() {
    this.instance = new ImageEditor(
      document.querySelector("#tui-image-editor"),
      {
        includeUI: {
          loadImage: {
            path: "https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c1d7a1feb60346449c1a64893888989a~tplv-k3u1fbpfcp-watermark.image",
            name: "image",
          },
          menu: ["resize", "crop", "rotate", "draw", "shape", "icon", "text", "filter"], // 底部菜单按钮列表 隐藏镜像flip和遮罩mask
          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";  // 隐藏顶部重置按钮
  },
  // 保存图片,并上传
  save() {
    const base64String = this.instance.toDataURL(); // base64 文件
    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 blob = new Blob([ia], { type: "image/png" }); // blob 文件
    const form = new FormData();
    form.append("image", blob);
    // upload file
  },
}

<style scoped>
.drawing-container {
  height: 900px;
  position: relative;
  .save {
    position: absolute;
    right: 50px;
    top: 15px;
  }
}
</style>

효과는 다음과 같습니다.

강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)

상단의 재설정 버튼이 사라지고 하단의 미러 및 마스크 버튼이 사라진 것을 확인할 수 있습니다. 오른쪽 상단에 추가 저장 버튼이 있습니다. 버튼을 클릭하면 base64 파일과 blob 파일이 생성됩니다.

전체 코드

<template>
  <div>
    <div id="tui-image-editor"></div>
    <el-button type="primary" size="small" @click="save">保存</el-button>
  </div>
</template>
<script>
import &#39;tui-image-editor/dist/tui-image-editor.css&#39;
import &#39;tui-color-picker/dist/tui-color-picker.css&#39;
import ImageEditor from &#39;tui-image-editor&#39;
const locale_zh = {
  ZoomIn: &#39;放大&#39;,
  ZoomOut: &#39;缩小&#39;,
  Hand: &#39;手掌&#39;,
  History: &#39;历史&#39;,
  Resize: &#39;调整宽高&#39;,
  Crop: &#39;裁剪&#39;,
  DeleteAll: &#39;全部删除&#39;,
  Delete: &#39;删除&#39;,
  Undo: &#39;撤销&#39;,
  Redo: &#39;反撤销&#39;,
  Reset: &#39;重置&#39;,
  Flip: &#39;镜像&#39;,
  Rotate: &#39;旋转&#39;,
  Draw: &#39;画&#39;,
  Shape: &#39;形状标注&#39;,
  Icon: &#39;图标标注&#39;,
  Text: &#39;文字标注&#39;,
  Mask: &#39;遮罩&#39;,
  Filter: &#39;滤镜&#39;,
  Bold: &#39;加粗&#39;,
  Italic: &#39;斜体&#39;,
  Underline: &#39;下划线&#39;,
  Left: &#39;左对齐&#39;,
  Center: &#39;居中&#39;,
  Right: &#39;右对齐&#39;,
  Color: &#39;颜色&#39;,
  &#39;Text size&#39;: &#39;字体大小&#39;,
  Custom: &#39;自定义&#39;,
  Square: &#39;正方形&#39;,
  Apply: &#39;应用&#39;,
  Cancel: &#39;取消&#39;,
  &#39;Flip X&#39;: &#39;X 轴&#39;,
  &#39;Flip Y&#39;: &#39;Y 轴&#39;,
  Range: &#39;区间&#39;,
  Stroke: &#39;描边&#39;,
  Fill: &#39;填充&#39;,
  Circle: &#39;圆&#39;,
  Triangle: &#39;三角&#39;,
  Rectangle: &#39;矩形&#39;,
  Free: &#39;曲线&#39;,
  Straight: &#39;直线&#39;,
  Arrow: &#39;箭头&#39;,
  &#39;Arrow-2&#39;: &#39;箭头2&#39;,
  &#39;Arrow-3&#39;: &#39;箭头3&#39;,
  &#39;Star-1&#39;: &#39;星星1&#39;,
  &#39;Star-2&#39;: &#39;星星2&#39;,
  Polygon: &#39;多边形&#39;,
  Location: &#39;定位&#39;,
  Heart: &#39;心形&#39;,
  Bubble: &#39;气泡&#39;,
  &#39;Custom icon&#39;: &#39;自定义图标&#39;,
  &#39;Load Mask Image&#39;: &#39;加载蒙层图片&#39;,
  Grayscale: &#39;灰度&#39;,
  Blur: &#39;模糊&#39;,
  Sharpen: &#39;锐化&#39;,
  Emboss: &#39;浮雕&#39;,
  &#39;Remove White&#39;: &#39;除去白色&#39;,
  Distance: &#39;距离&#39;,
  Brightness: &#39;亮度&#39;,
  Noise: &#39;噪音&#39;,
  &#39;Color Filter&#39;: &#39;彩色滤镜&#39;,
  Sepia: &#39;棕色&#39;,
  Sepia2: &#39;棕色2&#39;,
  Invert: &#39;负片&#39;,
  Pixelate: &#39;像素化&#39;,
  Threshold: &#39;阈值&#39;,
  Tint: &#39;色调&#39;,
  Multiply: &#39;正片叠底&#39;,
  Blend: &#39;混合色&#39;,
  Width: &#39;宽度&#39;,
  Height: &#39;高度&#39;,
  &#39;Lock Aspect Ratio&#39;: &#39;锁定宽高比例&#39;
}

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 {
  data() {
    return {
      instance: null
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      this.instance = new ImageEditor(document.querySelector(&#39;#tui-image-editor&#39;), {
        includeUI: {
          loadImage: {
            path: &#39;https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c1d7a1feb60346449c1a64893888989a~tplv-k3u1fbpfcp-watermark.image&#39;,
            name: &#39;image&#39;
          },
          menu: [&#39;resize&#39;, &#39;crop&#39;, &#39;rotate&#39;, &#39;draw&#39;, &#39;shape&#39;, &#39;icon&#39;, &#39;text&#39;, &#39;filter&#39;], // 底部菜单按钮列表 隐藏镜像flip和遮罩mask
          initMenu: &#39;draw&#39;, // 默认打开的菜单项
          menuBarPosition: &#39;bottom&#39;, // 菜单所在的位置
          locale: locale_zh, // 本地化语言为中文
          theme: customTheme // 自定义样式
        },
        cssMaxWidth: 1000, // canvas 最大宽度
        cssMaxHeight: 600 // canvas 最大高度
      })
      document.getElementsByClassName(&#39;tui-image-editor-main&#39;)[0].style.top = &#39;45px&#39; // 调整图片显示位置
      document.getElementsByClassName(
        &#39;tie-btn-reset tui-image-editor-item help&#39;
      )[0].style.display = &#39;none&#39; // 隐藏顶部重置按钮
    },
    // 保存图片,并上传
    save() {
      const base64String = this.instance.toDataURL() // base64 文件
      const data = window.atob(base64String.split(&#39;,&#39;)[1])
      const ia = new Uint8Array(data.length)
      for (let i = 0; i < data.length; i++) {
        ia[i] = data.charCodeAt(i)
      }
      const blob = new Blob([ia], { type: &#39;image/png&#39; }) // blob 文件
      const form = new FormData()
      form.append(&#39;image&#39;, blob)
      // upload file
    }
  }
}
</script>

<style scoped>
.drawing-container {
  height: 900px;
  position: relative;
  .save {
    position: absolute;
    right: 50px;
    top: 15px;
  }
}
</style>

요약

위는 tui.image-editor의 기본 사용법입니다. 다른 플러그인에 비해 tui.image-editor는 강력하고 사용하기 쉽다는 장점이 있습니다.

플러그인은 사용하기 쉽지만 작은 버그도 발견했습니다. 사진을 확대하면 표시 위치를 손바닥으로 드래그한 다음 재설정 버튼을 클릭하면 사진이 사라질 수 있습니다. 두 가지 해결 방법이 있는데, 하나는 소스 코드를 변경하고 ResetZoom 메소드를 호출하여 재설정하기 전에 확대/축소 비율을 복원하는 것이고, 다른 하나는 재설정 버튼을 클릭한 후 this.init 메소드를 호출하여 다시 렌더링하는 것입니다. .

다른 사람에게 장미를 선물하면 손에 향기가 남습니다. 유용하다고 생각하시면 좋아요 한번 눌러주세요~

더 많은 API와 데모는 다음을 참고하세요:

github 주소: https://github.com/nhn/tui.image -editor

API 및 예제 주소: http://nhn.github.io/tui.image-editor/latest

이 기사는 다음에서 복제되었습니다: https://juejin.cn/post/7027943745530101773

저자 : Front-end A Fei

자세히 프로그래밍 관련 지식을 더 알고 싶다면 프로그래밍 입문을 방문하세요! !

위 내용은 강력한 Vue 이미지 편집 플러그인을 공유하세요(와서 사용해 보세요!)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 掘金社区--前端阿飞에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제