Vue、fabricJS 画布实现自由绘制折线

1

作者GitHub:https://github.com/gitboyzcf 有兴趣可关注

Vue3代码,Vue2相似改吧改吧

前言

Fabric.js

Fabric.js(英文官网)是一个强大而简单的 Javascript HTML5画布库(也就是针对canvas进行的封装操作,使用起来更方便)

Fabric在画布元素的顶部提供交互式对象模型、Fabric还具有SVG到画布(以及画布到SVG)解析器

安装

npm install fabric --save
or
pnpm install fabric --save
or
yarn add fabric --save

实现

请添加图片描述

Demo.vue

<script setup>
import { fabric } from 'fabric'
let canvas = null // 画布实例
let currentPolyline = null // 临时折线
let points = []

// 初始化画布
const init = () => {
  canvas = new fabric.Canvas('c')
  canvas.selectionColor = 'transparent'
  canvas.selectionBorderColor = 'transparent'
  canvas.skipTargetFind = true // 禁止选中
  canvas.on('mouse:down', canvasMouseDown) // 鼠标在画布上按下
  canvas.on('mouse:move', canvasMouseMove) // 鼠标在画布上移动
  canvas.on('mouse:dblclick', canvasMouseDblclick) // 鼠标在画布上双击
}

// 创建折线
const createPolyline = (e) => {
  const currentPoint = e.absolutePointer
  currentPolyline = new fabric.Polyline(
    [
      { x: currentPoint.x, y: currentPoint.y },
      { x: currentPoint.x, y: currentPoint.y }
    ],
    {
      fill: 'transparent',
      stroke: 'red',
      objectCaching: false
    }
  )
  canvas.add(currentPolyline)
}

// 修改当前正在创建的折线
const changeCurrentPolyline = (e) => {
  const currentPoint = e.absolutePointer

  let points = currentPolyline.points

  points.push({
    x: currentPoint.x,
    y: currentPoint.y
  })
  canvas.requestRenderAll()
}

// 折线橡皮带
const changePolylineBelt = (e) => {
  const currentPoint = e.absolutePointer
  let points = currentPolyline.points

  points[points.length - 1].x = currentPoint.x
  points[points.length - 1].y = currentPoint.y

  canvas.requestRenderAll()
}

// 完成折线绘制
const finishPolyline = (e) => {
  const currentPoint = e.absolutePointer
  let points = currentPolyline.points
  points[points.length - 1].x = currentPoint.x
  points[points.length - 1].y = currentPoint.y

  points.pop()
  points.pop()
  // 按需添加自闭合代码
  // if (points[0].x != points[points.length - 1].x && points[0].y != points[points.length - 1].y) {
   	// changeCurrentPolyline({ absolutePointer: { x: points[0].x, y: points[0].y } })
  // }
  canvas.remove(currentPolyline)

  if (points.length > 1) {
    let polyline = new fabric.Polyline(points, {
      stroke: 'red',
      fill: 'transparent'
    })

    canvas.add(polyline)
  }
  currentPolyline = null

  canvas.requestRenderAll()
}

// 鼠标在画布上按下
const canvasMouseDown = (e) => {
  if (currentPolyline === null) {
    createPolyline(e)
  } else {
    changeCurrentPolyline(e)
  }
}

// 鼠标在画布上移动
const canvasMouseMove = (e) => {
  if (currentPolyline) {
    changePolylineBelt(e)
  }
}

// 鼠标在画布上双击
const canvasMouseDblclick = (e) => {
  finishPolyline(e)
}

onMounted(() => {
  init()
})
</script>

<template>
  <div>
    <canvas id="c" width="500" height="470" style="border: 1px solid #ccc"></canvas>
  </div>
</template>






到这里就结束了,后续还会更新 前端 系列相关,还请持续关注!
感谢阅读,若有错误可以在下方评论区留言哦!!!

111

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/128139.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式-创建者模式-工厂模式

工厂模式 工厂模式简单工厂模式工厂方法模式抽象工厂模式 工厂模式 要求&#xff1a;由一个特定的工厂提供所需的对象&#xff0c;由工厂来完成对象的创建 工厂模式一般分为三种&#xff1a;简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式 其中简单工厂模式不…

SSL证书优惠购买,HTTPS证书双11价格

SSL证书优惠购买哪里有&#xff1f;如何申请HTTPS证书&#xff1f;就看沃通2023“双十一限时特惠”活动&#xff0c;精选HTTPS证书、国密HTTPS证书年度优惠好价&#xff0c;单域名SSL证书、通配符SSL证书任您选择&#xff01;沃通优惠价格、服务优势&#xff0c;访问沃通CA官网…

为什么说软文推广中了解用户是关键?

数字化时代下软文成为众多企业推广品牌的方式之一&#xff0c;所谓软文&#xff0c;就是指以向用户提供信息&#xff0c;并将产品隐含在信息中的柔性手段。 想要使软文效果明显&#xff0c;就必须深入了解用户&#xff0c;把握其需求、兴趣和行为特点&#xff0c;这也是今天媒…

白嫖阿里云服务器,速看!数量不多

白嫖阿里云服务器攻略来了&#xff0c;在阿里云免费试用中心可以申请免费服务器&#xff0c;但是阿里云百科不建议选择免费的&#xff0c;只有3个月使用时长&#xff0c;选择99元服务器不是更香&#xff0c;2核2G配置3M固定带宽&#xff0c;一年99元&#xff0c;重点是新老用户…

react 修改less文件后保存,内存溢出,项目崩溃问题解决

一、完整报错 一个很老的react项目&#xff0c;因为没有package-lock.json版本锁&#xff0c;导致拉下来的时候&#xff0c;安装的依赖版本冲突&#xff0c;好不容易启动起来&#xff0c;修改less文件后只要一保存&#xff0c;项目就会崩溃&#xff0c;需要重启&#xff0c;报…

如何优雅的开发?试试这个低代码项目

一、前言 众所周知&#xff0c;开发一个大型的企业级系统&#xff0c;公司往往需要大量的人力做支持后盾&#xff0c;如需要需求分析师、数据库管理员、前台美工、后台程序员、测试人员等。 在快速发展中的企业里&#xff0c;尤其是中小企业&#xff0c;都是一个萝卜多个坑&…

说说React的事件机制?

一、是什么 React基于浏览器的事件机制自身实现了一套事件机制&#xff0c;包括事件注册、事件的合成、事件冒泡、事件派发等 在React中这套事件机制被称之为合成事件 合成事件&#xff08;SyntheticEvent&#xff09; 合成事件是 React模拟原生 DOM事件所有能力的一个事件…

怎么写日语开发信?写外贸日语开发信技巧?

如何写好日语开发信&#xff1f;日语开发信格式是怎么样的&#xff1f; 无论您是初学者还是有经验的营销专家&#xff0c;都需要掌握一些关键技巧&#xff0c;以确保您的邮件在日本市场取得成功。蜂邮将向您介绍怎样写一封令人印象深刻的日语开发信&#xff0c;以吸引潜在客户…

埃隆·马斯克旗下xAI推出PromptIDE工具,加速提示工程和可解释性研究

&#x1f989; AI新闻 &#x1f680; 埃隆马斯克旗下xAI推出PromptIDE工具&#xff0c;加速提示工程和可解释性研究 摘要&#xff1a;埃隆马斯克旗下人工智能初创公司xAI推出了PromptIDE工具&#xff0c;该工具是一个用于提示工程和可解释性研究的集成开发环境。通过该工具&a…

2024 年天津专升本招生实施办法(天津专升本文化报名考试时间)

2024 年天津市高职升本科招生实施办法 为做好2024年天津市高职升本科招生工作&#xff0c;天津市招生委员会高等学校招生办公室&#xff08;以下简称“市高招办”&#xff09;依据教育部、天津市有关规定&#xff0c;制定本实施办法。 一、招生章程 1&#xff0e;招生学校要制…

C语言求解:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位(约瑟夫问题)

完整代码&#xff1a; /* 有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人 退出圈子&#xff0c;问最后留下的是原来第几号的那位*/ #include<stdio.h>//约瑟夫问题 //递推关系f(n)(f(n-1)2)\mod n…

Python---upper()--转大写///与lower() --转小写

upper()&#xff1a;把字符串全部转换为 大写形式 lower()&#xff1a;把字符串全部转换为 小写形式 upper 英 /ˈʌpə(r)/ adj. 上面的&#xff0c;上层的&#xff0c;较高的&#xff1b;顶部的&#xff0c;上部的&#xff1b;&#xff08;在机构、体系等中&#xff…

单链表(增删改查)【超详细】

目录 单链表 1.单链表的存储定义 2.结点的创建 3.链表尾插入结点 4.单链表尾删结点 5.单链表头插入结点 6.单链表头删结点 7.查找元素&#xff0c;返回结点 8.在pos结点前插入一个结点 ​编辑 9.在pos结点后插入一个结点 10.删除结点 11.删除pos后面的结点 12.修改…

科技改变农业:合成数据农业中的应用

介绍 农业在我们的生活中起着至关重要的作用&#xff0c;它为我们提供了生存的食物。如今&#xff0c;它遇到了各种困难&#xff0c;例如气候变化的影响、缺乏工人以及全球流行病造成的中断。这些困难影响了耕作用水和土地的供应&#xff0c;而这些水和土地正变得越来越稀缺。…

小红书广州探店达人对接流程,小红书达人话术有哪些?

很多时候&#xff0c;在刚开始接触这个行业时&#xff0c;许多人不知道如何对接达人&#xff0c;也不知道如何开口才能一下子打蛇打七寸&#xff0c;有事半功倍之效。今天我们为大家带来小红书广州探店达人对接流程&#xff0c;小红书达人话术有哪些&#xff1f; 1. 自我介绍和…

CAN总线记录诊断助手 CAN记录仪

随着CAN总线的应用市场越来越多&#xff0c;不仅局限于汽车行业&#xff0c;工程车、特种车、消防、医疗等多行业都是以CAN总线通讯为主。总线的调试诊断也成为技术日常工作&#xff0c;有个好的工具能有效帮助发现问题、解决问题。 来可电子的CANLog-VCI是一款即插即用的CAN数…

智汇云舟入选IDC《中国智慧园区解决方案2023年厂商评估》报告

近日&#xff0c;全球领先的市场研究和咨询公司IDC发布报告《中国智慧园区解决方案2023年厂商评估》。报告内&#xff0c;IDC对中国市场具有代表性、且符合评估入围门槛要求的智慧园区解决方案厂商进行了综合评估。智汇云舟凭借在产品、技术等方面的综合优势&#xff0c;与大华…

智汇云舟荣获2023轨道交通国际创新创业大赛“最具市场前景奖”

11月9日&#xff0c;由北京市科学技术委员会、中关村科技园区管理委员会、北京市经济和信息化局、北京市丰台区人民政府、中关村发展集团股份有限公司主办的2023中关村轨道交通国际创新创业大赛总决赛圆满收官。 智汇云舟提报的《视频孪生 改变视界》项目在数百个参赛项目中脱…

IDEA取消git对项目的版本控制

前言 前几天新建项目的时候不小心选了个git仓库&#xff0c;导致这个测试项目一直被git管理着。 解决办法 1 右键项目 选择打开资源目录 2 删除.git文件 把目录下的.git文件删掉 3 删除idea中的git管理 删除完.git文件后&#xff0c;进入idea&#xff0c;右下角会有这样的提…

GoLong的学习之路(二十三)进阶,语法之并发(go最重要的特点)(锁,sync包,原子操作)

这章是我并发系列中最后的一章。这章主要讲的是锁。但是也会讲上一章channl遗留下的一些没有讲到的内容。select关键字的用法&#xff0c;以及错误的一些channl用法。废话不多说。。。 文章目录 select多路复用通道错误示例并发安全和锁问题描述互斥锁读写互斥锁 syncsync.Wait…