【fabrc.js】 操作鼠标自由绘制图形:矩形、圆形、直线等图形【画图功能】

29 篇文章 0 订阅
11 篇文章 1 订阅

前言:

        在图形编辑器类型的项目当中,通过键盘触发想要绘制的图形类型,然后通过鼠标在fabric画布上自由绘制你想需要的内容。从画基本的矩形、圆形、直线、文本、三角形、折线等功能中,可以扩展出“钢笔path贝塞尔路径”、“多图形组合”、图形合并、图形拆分、解析svg文件(符合要求的文件皆可)进行导入等较为复杂的功能等。

        虽然上述介绍了很多各个不同的功能,但本篇写的内容仅限于文章标题范围!
        其他提到的本文肯定不可能都写出来,实际写出来代码就太多了。但是所有的功能都离不开核心的基础地基,打好地基,扩展出对应的功能便轻而易举。

主要涉及功能:

功能对应的全局键盘快捷键、监听画布事件(鼠标按下、鼠标移动、鼠标松开)、初始化图形相关数据并添加进画布、更新画布、计算并更新图形坐标、画布框选功能启用/关闭;

相关要求:

  1. 通过界面按钮或键盘快捷键启用对应图形的绘画模式;(本文所使用的快捷键库若有了解的需要自行搜索我对应文章即可;)
  2. 监听fabric鼠标按下事件、移动事件、弹起事件;
  3. 在鼠标按下事件中创建图形根据不同图形类型声明对应的初始数据
  4. 在鼠标移动事件中实时更新对应图形的相关坐标
  5. 在鼠标弹起事件中结束绘画,恢复相关数据初始值,并根据自身业务需求进行额外操作即可。

其他注意事项:绘画过程中按其他相关键盘快捷键则结束当前图形绘画。当然也不一定都是结束当前绘画执行新快捷键的功能,例如有辅助画正圆 正方的需求处理。所以这些都是根据自身业务需求进行定制功能,思维要灵活。

PS: 本文不对相关功能进行拆分,一个文件里展示完,自己写业务的时候进行相关拆分、封装即可;


<template>
  <div class="cdie" id="cdie">
    <canvas id="c" ref="canvas"></canvas>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted, reactive } from "vue";
import { fabric } from "fabric";
import hotkeys from 'hotkeys-js';
window.fabric = fabric
let f = null
let canvas = ref();

let drawType;
function initHotkey() {
  hotkeys('r', () => {
    // 矩形
    drawType = 'r' // 简单写个值,在业务里建议定义枚举类较好。
  });
  hotkeys('l', () => {
    // 直线
    drawType = 'l' // 简单写个值,在业务里建议定义枚举类较好。
  });
  hotkeys('c', () => {
    // 圆形
    drawType = 'c' // 简单写个值,在业务里建议定义枚举类较好。
  });
}
onMounted(() => {
  window.canvas = f = new fabric.Canvas(canvas.value, {
    backgroundColor: "grey",
    width: 1000,
    height: 500,
  });
  initHotkey() // 声明图形绘画的启用快捷键
  initDrawEvent(f) // 创建图形绘画相关事件;
});
function initDrawEvent(canvas) {
  let shape: fabric.Object | null;
  let startPoint: fabric.IPoint; // 记录初始坐标
  canvas.on('mouse:down', (e) => {
    if (e.target || !drawType) {
      // 如果绘画点击在图片上,则不进行绘画
      return;
    }
    if (!shape) {
      f.selection = false;
      startPoint = e.absolutePointer
      switch (drawType) {
        case 'r':
          shape = new fabric.Rect({ //创建对应图形类型
            left: startPoint.x,
            top: startPoint.y,
            width: 0,
            height: 0,
            fill: undefined,
            stroke: 'red'
          });
          break;
        case 'c':
          shape = new fabric.Ellipse({
            left: startPoint.x,
            top: startPoint.y,
            rx: 0,
            ry: 0,
            fill: undefined,
            stroke: 'red'
          });
          break;
        case 'l':
          shape = new fabric.Line([startPoint.x, startPoint.y, startPoint.x, startPoint.y], {
            fill: undefined,
            stroke: 'red'
          });
          break;
        default:
          break;
      }
      if (shape) {
        f.add(shape); //添加图形
        f.requestRenderAll(); //刷新画布
      }
    }
    window.selected = e?.target // 当点击选择到有可选图形时,会获得图形的数据。
  }).on('mouse:move', (e: fabric.IEvent<MouseEvent>) => {
    if (drawType && shape) {
      const p = f.getPointer(e.e) || {
        x: 0,
        y: 0,
      };
      const minX = Math.min(p.x, startPoint.x);
      const minY = Math.min(p.y, startPoint.y);
      let w = Math.abs(p.x - startPoint.x);
      let h = Math.abs(p.y - startPoint.y);
      switch (drawType) {
        case 'r':
          shape.set({
            left: minX,
            top: minY,
            width: w,
            height: h,
          });
          break;
        case 'c':
          shape.set({
            left: minX,
            top: minY,
            rx: w / 2,
            ry: h / 2,
          });
          break;
        case 'l':
          let x1 = startPoint.x;
          let y1 = startPoint.y;
          let x2 = p.x;
          let y2 = p.y;
          console.log(startPoint, p);

          shape.set({
            x1,
            y1,
            x2,
            y2,
          });
          break;
        default:
          break;
      }
      f.requestRenderAll();
    }
  }).on('mouse:up', (e) => {
    if (drawType && shape) {
      shape.setCoords(); // 更新图像坐标;
      drawType = null
      f.selection = true;
      shape = null;
      f.requestRenderAll();  
    }
  })
}

</script>

<style scoped lang="less">
.cdie {
  width: 100%;
  text-align: center;
  display: flex;
  justify-content: center;
}
</style>

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: openseadragon-fabricjs-overlay.js一个用于在OpenSeadragon图像查看器中添加矩形圆形直线等标记的插件。它结合了OpenSeadragon和Fabric.js库的功能,为用户提供了绘制和编辑标记的能力。 通过openseadragon-fabricjs-overlay.js,我们可以在OpenSeadragon图像查看器上创建矩形圆形直线等形状作为标记。我们可以通过指定形状的位置、大小、颜色等属性来自定义标记的外观。同时,我们还可以添加标签或文字等额外信息,以便进一步描述标记。 这个插件不仅支持创建新的标记,还可以对已存在的标记进行编辑和删除。用户可以通过拖拽、缩放和旋转等交互方式对标记进行调整。这使得用户可以自由地在图像上添加、修改和删除标记,以满足不同的需求。 openseadragon-fabricjs-overlay.js一个强大而灵活的插件,为用户提供了丰富的标记选择和操作功能。对于需要在OpenSeadragon图像查看器中进行标记的应用场景,它是一个非常有价值的工具。无论是学术研究、地理信息系统或其他需要对图像进行标注和分析的领域,openseadragon-fabricjs-overlay.js都可以方便地加入到现有项目中,提供更加丰富的交互和展示效果。 ### 回答2: openseadragon-fabricjs-overlay.js一个用于在 OpenSeadragon 图像查看器中进行标记的插件。它基于 Fabric.js 库,提供了在图像上绘制矩形圆形直线等标记的功能。 使用该插件,我们可以在图像上创建矩形圆形直线标记。首先,我们需要创建一个 Fabric.js canvas,将其添加到 OpenSeadragon 图像查看器中。然后,我们可以使用该插件提供的方法,例如 createRect、createCircle 和 createLine 来绘制标记。 例如,要创建一个矩形标记,我们可以使用 createRect 方法,并指定矩形的位置、大小和样式等参数。类似地,我们可以使用 createCircle 方法创建圆形标记,使用 createLine 方法创建直线标记。 绘制完成后,我们可以通过修改标记的属性来实现进一步的交互。例如,我们可以通过调整标记的位置、大小或颜色来修改标记的外观。我们还可以添加事件处理程序,使得标记可以响应用户的交互,例如点击或拖动。 总之,openseadragon-fabricjs-overlay.js一个方便的插件,它使我们可以在 OpenSeadragon 图像查看器中添加矩形圆形直线等标记。使用该插件,我们可以轻松地进行图像标注、注释或其他形式的交互,从而丰富用户的图像浏览体验。 ### 回答3: openseadragon-fabricjs-overlay.js一个库,用于在OpenSeadragon中添加矩形圆形直线等标记。它基于fabric.js库,结合OpenSeadragon的功能,使得用户可以在OpenSeadragon图像上创建和编辑各种形状。 该库使用起来非常简便,只需要在OpenSeadragon实例中导入openseadragon-fabricjs-overlay.js,并设置所需的标记。例如,如果我们想要在OpenSeadragon图像中添加一个矩形,我们可以使用如下代码: ```javascript var viewer = OpenSeadragon({ // OpenSeadragon的配置选项 ... }); var overlay = viewer.fabricjsOverlay({ // openseadragon-fabricjs-overlay.js的配置选项 ... }); var rect = new fabric.Rect({ top: 100, left: 100, width: 200, height: 150, fill: 'red', opacity: 0.5 }); overlay.fabricCanvas().add(rect); ``` 通过以上代码,我们就在OpenSeadragon图像上成功添加了一个红色的半透明矩形。同样,我们也可以使用相似的方式添加圆形直线等形状,只需调整相应的配置和参数即可。 openseadragon-fabricjs-overlay.js提供了丰富的功能,可以自定义标记的样式、位置和交互行为。我们还可以通过该库实现标记的编辑和移动操作,使得用户可以根据需要在OpenSeadragon图像中添加各种标记,帮助用户更好地理解和分析图像内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值