当前位置: 首页 > news >正文

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

前言:

        在图形编辑器类型的项目当中,通过键盘触发想要绘制的图形类型,然后通过鼠标在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.absolutePointerswitch (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 = nullf.selection = true;shape = null;f.requestRenderAll();  }})
}</script><style scoped lang="less">
.cdie {width: 100%;text-align: center;display: flex;justify-content: center;
}
</style>

相关文章:

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

前言&#xff1a; 在图形编辑器类型的项目当中&#xff0c;通过键盘触发想要绘制的图形类型&#xff0c;然后通过鼠标在fabric画布上自由绘制你想需要的内容。从画基本的矩形、圆形、直线、文本、三角形、折线等功能中&#xff0c;可以扩展出“钢笔path贝塞尔路径”、“多图形组…...

WPF 显示PDF、PDF转成图片

1.NuGet 安装 O2S.Components.PDFView4NET.WPF 2.添加组件 工具箱中&#xff0c;空白处 右键&#xff0c;选择项 WPF组件 界面&#xff0c;选择NuGet安装库对面路径下的 O2S.Components.PDFView4NET.WPF.dll 3.引入组件命名空间&#xff0c;并使用 <Windowxmlns"htt…...

CODESYS的Robotics_PickAndPlace_without_Depictor例程解释

1.简介 在CODESYS的例程中&#xff0c;有一个例程演示了如何控制delta机械手从一个移动的转盘中拾取一个工件&#xff08;ring&#xff0c;圆环&#xff09;&#xff0c;然后放到移动的传送带上的托盘&#xff08;cone&#xff0c;圆锥&#xff09;中。这个例程在【C:\Program…...

通过全流量分析Web业务性能好坏

随着全球商业环境的不断发展和变化&#xff0c;业务性能的重要性愈发凸显。无论是传统实体企业还是纯线上企业&#xff0c;业务性能都是其核心竞争力和稳定运营的关键要素。良好的业务性能不仅可以提升客户满意度、增加市场份额&#xff0c;还可以降低成本、提高效率。 本文章…...

【C语言】自定义类型——枚举、联合体

引言 对枚举、联合体进行介绍&#xff0c;包括枚举的声明、枚举的优点&#xff0c;联合体的声明、联合体的大小。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 枚举 枚举…...

大模型自定义算子优化方案学习笔记:CUDA算子定义、算子编译、正反向梯度实现

01算子优化的意义 随着大模型应用的普及以及算力紧缺&#xff0c;下一步对于计算性能的追求一定是技术的核心方向。因为目前大模型的计算逻辑是由一个个独立的算子或者说OP正反向求导实现的&#xff0c;底层往往调用的是GPU提供的CUDA的驱动程序。如果不能对于整个计算过程学习…...

【密码学基础】Diffie-Hellman密钥交换协议

DH介绍 Diffie-Hellman密钥协议算法是一种确保共享密钥安全穿越不安全网络的方法。 这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥&#xff0c;然后可以用这个密钥进行加密和解密。 但是注意&#xff0c;这个密钥交换协议 只能用于密钥的交换&#xff0c;而…...

最新AI绘画Midjourney绘画提示词Prompt教程

一、Midjourney绘画工具 SparkAi【无需魔法使用】&#xff1a; sparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的…...

AI助力DevOps新时代

根据2023年Gitlab全球DevSecOps报告&#xff0c;62%使用AI和ML的开发人员表示他们正在使用AI来检查代码&#xff0c;而2022年这一比例只有51%。 人工智能在 DevOps 中的作用 虽然今年年初&#xff0c;随着GPT的爆火&#xff0c;AI技术逐渐深入人心&#xff0c;但在很早以前&…...

Spring之容器:IOC(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…...

Spring 依赖查找知识点总结

前言 源码在我github的guide-spring仓库中&#xff0c;可以克隆下来 直接执行。 我们本文主要来介绍依赖查找的使用示例 依赖查找 什么是依赖查找 依赖查找并不是 Spring 框架特有的概念&#xff0c;它是一种在软件开发中获取依赖对象的方式。它通常用于获取运行时需要的服…...

html5新增特性

对于这行代码&#xff0c;要写在html页面的最前端&#xff1a; <!DOCTYPE html> 为什么要写在前面&#xff1f; 这是声明&#xff0c;是html5的新特性 对于html4来说&#xff0c;它有三种声明格式&#xff0c;而html5只需要统一声明&#xff0c;用来告诉浏览器文档使用…...

4、APScheduler: 详解Scheduler种类用法、常见错误与解决方法【Python3测试任务管理总结】

调度器(Scheduler)是将其他组件绑在一起的关键。通常在应用程序中只运行一个调度器。应用程序开发者通常不直接处理作业存储(job stores)、执行器(executors)或触发器(triggers)。相反,调度器提供了适当的接口来处理所有这些。通过调度器配置作业存储和执行器,以及添…...

微服务实战系列之ZooKeeper(实践篇)

前言 关于ZooKeeper&#xff0c;博主已完整的通过庖丁解牛式的“解法”&#xff0c;完成了概述。我想掌握了这些基础原理和概念后&#xff0c;工作的问题自然迎刃而解&#xff0c;甚至offer也可能手到擒来&#xff0c;真实一举两得&#xff0c;美极了。 为了更有直观的体验&a…...

C++ 开发中为什么要使用继承

为何继承 实验介绍 继承是 C++ 中的特性之一,使用继承能够有效减轻工作量,使得开发更加高效。 知识点 什么是继承为何继承继承的内容权限关键字什么是继承 生活中继承是指孩子继承父亲的财产等。C++ 使用了这一思想,却又与生活中的继承不一样。 在使用继承时,派生类是…...

2020蓝桥杯c组纸张大小

题目名字 纸张大小 题目链接 题意 给一张纸&#xff0c;通过不断折叠&#xff0c;求最终长宽&#xff0c;给十个数字&#xff0c;输入哪个数字就求哪次折叠的长宽&#xff0c;其实就是&#xff0c;每次折叠后长度的一半变为宽度&#xff0c;原来的宽度变成长度 思路 因为数字…...

【Image】图像处理

计算机视觉 CV Perception 如自动驾驶领域。 只要是从所谓的图像当中去抽取信息的过程&#xff0c;我们都叫做Perception。 视觉检测可以涵盖二维检测&#xff0c;如车辆、人和信号灯的检测。另外&#xff0c;还可以控制三维信息&#xff0c;直接在三维空间中操作数据。 SL…...

JAVA对文档加密

当 Word 文档中包含无法公开的机密信息时&#xff0c;我们可以对其进行加密&#xff0c;使其在没有密码的情况下无法打开。本文将向您介绍如何使用 Spire.Doc for Java 加密 Word 文档和移除 Word 密码保护。 加密 Word 文档删除 Word 密码保护 安装 Spire.Doc for Java 首先…...

EmbedAI:一个可以上传文件训练自己ChatGPT的AI工具,妈妈再也不用担心我的GPT不会回答问题

功能介绍&#xff1a; 个性化定制&#xff1a;提供灵活的训练选项&#xff0c;用户能够通过文件、网站、Notion文档甚至YouTube等多种数据源对ChatGPT进行训练&#xff0c;以满足不同领域和需求的个性化定制。广泛应用场景&#xff1a;ChatGPT支持多种用例&#xff0c;包括智能…...

runCatching异常捕获onSuccess/onFailure返回函数,Kotlin

runCatching异常捕获onSuccess/onFailure返回函数&#xff0c;Kotlin fun test(a: Int, b: Int) {runCatching {a / b}.onSuccess {println("onSuccess: $it")return ok(it)}.onFailure {println("onFailure: $it")return fail(it)} }fun ok(o: Any) {prin…...

CasRel在企业搜索中的应用:构建结构化语义索引提升召回质量

CasRel在企业搜索中的应用&#xff1a;构建结构化语义索引提升召回质量 1. 引言&#xff1a;当搜索遇到瓶颈 你有没有遇到过这种情况&#xff1a;在公司内部的知识库里搜索“2024年第三季度华东区的销售数据”&#xff0c;结果返回了一堆包含“销售”、“数据”、“华东”等关…...

从草图到逼真人脸:Qwen-Image-Edit-F2P结合ControlNet的进阶玩法展示

从草图到逼真人脸&#xff1a;Qwen-Image-Edit-F2P结合ControlNet的进阶玩法展示 最近在玩AI图像生成的朋友&#xff0c;可能都遇到过这样的烦恼&#xff1a;想让AI画一张特定角度、特定表情的人脸&#xff0c;光靠文字描述&#xff0c;结果总是像开盲盒。你说“一个微笑的东方…...

结合鸿蒙系统特性:在HarmonyOS应用中嵌入Pixel Couplet Gen生成能力

结合鸿蒙系统特性&#xff1a;在HarmonyOS应用中嵌入Pixel Couplet Gen生成能力 1. 引言&#xff1a;当传统艺术遇见分布式技术 春节贴春联是中国人延续千年的文化传统&#xff0c;而如今&#xff0c;借助AI技术和鸿蒙系统的分布式能力&#xff0c;我们可以让这一传统焕发新的…...

Flux Sea Studio 极限测试:生成8K超高清巨幅海景壁纸的技术挑战与实现

Flux Sea Studio 极限测试&#xff1a;生成8K超高清巨幅海景壁纸的技术挑战与实现 最近在折腾AI生成图片&#xff0c;发现一个挺有意思的挑战&#xff1a;用Flux Sea Studio这类模型&#xff0c;能不能做出那种能铺满整块大屏幕的、细节拉满的8K超高清壁纸&#xff1f;特别是海…...

AG-UI协议实战:构建智能体驱动的动态前端交互系统

1. AG-UI协议&#xff1a;智能体与前端交互的新范式 第一次听说AG-UI协议时&#xff0c;我正在为一个电商项目头疼——后台AI生成的商品推荐总需要手动同步到前端&#xff0c;代码里到处是setState和事件监听。直到发现这个协议&#xff0c;才明白原来智能体和前端可以像两个老…...

STM32智能剪枝机:嵌入式系统与传感器集成实践

1. 项目背景与需求分析作为一名从事嵌入式开发多年的工程师&#xff0c;我最近完成了一个基于STM32的智能绿化带剪枝机项目。这个项目的初衷源于我在城市公园散步时的观察&#xff1a;园艺工人手持笨重的剪枝工具&#xff0c;在烈日下长时间弯腰作业&#xff0c;不仅效率低下&a…...

探索偏心轮飞剪的 Codesys 程序奥秘:基于偏心轮加滑块机构

偏心轮 飞剪 电子凸轮 codesys程序源码 适用于偏心轮加滑块机构 在自动化控制领域&#xff0c;偏心轮飞剪系统凭借其独特的运动特性和高效的切割能力&#xff0c;在众多生产场景中发挥着关键作用。今天咱们就深入探讨基于偏心轮加滑块机构的偏心轮飞剪的 Codesys 程序源码&…...

text2vec-base-chinese终极指南:如何用768维向量彻底改变中文语义理解

text2vec-base-chinese终极指南&#xff1a;如何用768维向量彻底改变中文语义理解 【免费下载链接】text2vec-base-chinese 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/text2vec-base-chinese 还在为中文文本的语义匹配而头疼吗&#xff1f;传统的基于关…...

突破Wallpaper Engine资源壁垒:RePKG工具全方位应用指南

突破Wallpaper Engine资源壁垒&#xff1a;RePKG工具全方位应用指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 一、RePKG&#xff1a;解锁创意资源的技术钥匙 在数字创意领域…...

【个人推荐】一些好用的录音转写工具

因为助教课备课的缘故&#xff0c;需要录制讲座的音频以整理知识点。一次讲座的音频内容很长&#xff0c;即使3x速快进播放依然很耗费时间&#xff0c;因此录音转写的需求浮现了出来。于是闲暇之余探索了下市面上的录音转写工具&#xff0c;浅浅记录下体验。 下面主要推荐三款…...