fabric.js

目录

一、在canvas上画简单的图形

二、在canvas上用路径(Path)画不规则图形

三、在canvas上插入图片并设置旋转属性(angle)

四、让元素动起来(animate)

五、图像过滤器(filters)让图片多姿多彩

六、颜色模式(Color)和相互转换(toRgb、toHex)

七、对图形的渐变填充(Gradient)

八、文本(Text/Textbox)编辑和属性编辑

九、事件监听

十、方法

文档:https://fabricjs.com/

GitHub下载地址:https://github.com/fabricjs/fabric.js

将下载的文件夹里dist包的fabric.js或index.min.js文件拿过来,或者直接引入链接也可以使用,框架则需要用npm下载。

一、在canvas上画简单的图形

画出来的图形或者对象默认就可以进行拖拽拉伸和旋转操作。

<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- 引入方法 二选一 -->
    <script src="./index.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/4.5.0/fabric.min.js"></script>
  </head>
  <body>
    <canvas id="main" width="800" height="800"></canvas>
    <script type="text/javascript">
      var canvas = new fabric.Canvas("main");
      var rect = new fabric.Rect({
        left: 10,
        top: 100,
        fill: "red",
        width: 100,
        height: 100,
      });
      var circle = new fabric.Circle({
        radius: 50,
        fill: "green",
        left: 160,
        top: 50,
        height: 200,
      });
      var triangle = new fabric.Triangle({
        width: 100,
        height: 100,
        fill: "blue",
        left: 300,
        top: 100,
      });
      canvas.add(rect); //添加一个正方形
      canvas.add(circle); //添加一个圆形
      canvas.add(triangle);//添加一个三角形
    </script>
  </body>
</html>

二、在canvas上用路径(Path)画不规则图形

    <script type="text/javascript">
      var canvas = new fabric.Canvas("main");
      // 三角形的顶点坐标由 SVG 路径数据定义
      var path = new fabric.Path("M 0 0 L 200 100 L 170 200 z");
      path.set({
        left: 220,
        top: 120,
        fill: "yellow",
      });
      // 定义心形的 SVG 路径数据
      var heartPath =
        "M 100,150 " +
        "C 75,100 25,100 0,150 " +
        "C 25,200 75,200 100,250 " +
        "C 125,200 175,200 200,150 " +
        "C 175,100 125,100 100,150 z";
      var heart = new fabric.Path(heartPath, {
        left: 50,
        top: 25,
        fill: "red",
        stroke: "gold",
        strokeWidth: 2,
      });
      canvas.add(path);
      canvas.add(heart);
    </script>

svg数据举例:

    <!-- svg 圆 -->
    <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
      <circle cx="50" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
    </svg>
    <!-- svg 矩形 -->
    <svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
      <rect x="50" y="20" width="100" height="60" stroke="black" stroke-width="2" fill="blue" />
    </svg>

M是起点,L是绘制直线,Z是闭合路径,C是创建一个三次贝塞尔曲线,A是绘制大型弧形,a是绘制小型弧形。

矩形:xy 是起点坐标,w 是宽度,h 是高度

圆形:cx和cy是圆心坐标,rx和ry是半径

三、在canvas上插入图片并设置旋转属性(angle)

  <body>
    <canvas id="main" width="800" height="800"></canvas>
    <img src="./paper.png" alt="" id="paper-img" />
    <script type="text/javascript">
      var canvas = new fabric.Canvas("main");
      var imgRlement = document.getElementById("paper-img");
      var imgInstance = new fabric.Image(imgRlement, {
        left: 100,
        top: 100,
        width: 500,
        height: 500,
        angle: 30,
      });
      canvas.add(imgInstance);
      // 第二种:直接导入路径
      fabric.Image.fromURL(
        "./paper.png",
        function (oImg) {
          oImg.scale(0.1);
          canvas.add(oImg);
        },
        { crossOrigin: "anonymous" }
      );
    </script>
  </body>

四、让元素动起来(animate)

  <body>
    <canvas id="main" width="800" height="800"></canvas>
    <script type="text/javascript">
      var canvas = new fabric.Canvas("main");
      var rect = new fabric.Rect({
        left: 100,
        top: 100,
        fill: "red",
        width: 100,
        height: 100,
      });
      // 设置初始角度为45度
      rect.set("angle", 45);
      // 将矩形添加到 canvas
      canvas.add(rect);
      // 执行旋转动画
      rect.animate("angle", 360, {
        duration: 2000, // 动画持续时间 2 秒
        easing: fabric.util.ease.easeOutBounce, // 缓动效果
        onChange: canvas.renderAll.bind(canvas), // 每帧渲染一次
      });
    </script>
  </body>

五、图像过滤器(filters)让图片多姿多彩

下面展示常见的六种滤镜,可以单独使用,也可以混合使用(可加对比度【Contrast】):

  <body>
    <canvas id="main" width="800" height="800"></canvas>
    <script type="text/javascript">
      var canvas = new fabric.Canvas("main");
      fabric.Image.fromURL("redhat.png", function (img) {
        // 1、给图片添加灰度滤镜
        img.filters.push(new fabric.Image.filters.Grayscale());
        // 2、老照片的棕色调效果
        img.filters.push(new fabric.Image.filters.Sepia());
        // 3、反转图像的颜色:负片效果
        img.filters.push(new fabric.Image.filters.Invert());
        // 4、给图片添加马赛克
        img.filters.push(
          new fabric.Image.filters.Pixelate({
            blocksize: 10, // 像素块大小,值越大像素化效果越明显
          })
        );
        // 5、模糊图像
        img.filters.push(
          new fabric.Image.filters.Blur({
            blur: 0.5, // 控制模糊的程度
          })
        );
        // 6、调整图像的亮度
        img.filters.push(
          new fabric.Image.filters.Brightness({
            brightness: -0.5, // 亮度值,值范围:-1到1,负值降低亮度,正值提高亮度
          })
        );

        // 应用滤镜并刷新画布
        // img.applyFilters(canvas.renderAll.bind(canvas));旧版本
        img.applyFilters();
        canvas.add(img);
      });
    </script>
  </body>

补充:fabric.Image.filters.Contrast可以调整图像的对比度

        img.filters.push(
          new fabric.Image.filters.Sepia(), // 怀旧照片
          new fabric.Image.filters.Brightness({
            brightness: -0.5,
          }), // 亮度滤镜
        //对比度值范围:-1到1,负值降低对比度,正值提高对比度
          new fabric.Image.filters.Contrast({ contrast: 0.3 })
        );

六、颜色模式(Color)和相互转换(toRgb、toHex)

    <script type="text/javascript">
      var canvas = new fabric.Canvas("main");

      var color1 = new fabric.Color("#f11");//红色
      var color2 = new fabric.Color("#4168FF");//蓝色
      var color3 = new fabric.Color("rgb(10,20,30,0.5)");

      var color6 = color1.toRgb();
      var color7 = color3.toHex();
      // 用color2覆盖color1,并转为rgb格式
      var color8 = color1.overlayWith(color2).toRgb();//紫色
      console.log(color6); //rgb(255,17,17)
      console.log(color7); //0A141E
      var rect = new fabric.Rect({
        left: 100,
        top: 100,
        width: 300,
        height: 300,
        fill: color8,
      });
      canvas.add(rect)
    </script>

七、对图形的渐变填充(Gradient)

    <script type="text/javascript">
      var canvas = new fabric.Canvas("main");
      var circle = new fabric.Circle({
        left: 100,
        top: 100,
        radius: 150,
        strokeWidth: 2,
        stroke: "red",
        fill: new fabric.Gradient({
          type: "linear", // 线性渐变
          x1: 0, // 渐变起点 (x)
          y1: 0, // 渐变起点 (y)
          x2: 1, // 渐变终点 (x)
          y2: 1, // 渐变终点 (y)
          colorStops: [
            { offset: 0, color: "#ff0000" }, // 起始颜色:红色
            { offset: 1, color: "#0000ff" }, // 结束颜色:蓝色
          ],
        }),
      });
      console.log(circle.fill);
      canvas.add(circle);
    </script>

八、文本(Text/Textbox)编辑和属性编辑

  <body>
    <canvas id="main" width="800" height="800"></canvas>
    <script type="text/javascript">
      var canvas = new fabric.Canvas("main");
      // 单行文本
      // var text = new fabric.Text("Hello Everyone", {
      // 多行文本
      var text = new fabric.Textbox("Hello\nEveryone\nThis is a multiline text.", {
        left: 100,
        top: 100,
        fontFamily: "Arial",
        fontSize: 70,
        fill: "green",
        textAlign: "left",
        width: 600,
        lineHeight: 1.5,
        textDecoration: "underline", // 设置下划线:overline | line-through 【版本问题可能显示不出来】
      });
      canvas.add(text);
    </script>
  </body>

九、事件监听

      canvas.on("mouse:down", function (options) {
        console.log(options.e.clientX, options.e.clientY);
      });
      rect.on("selected", function () {
        console.log("selected a rect");
      });
      circle.on("selected", function () {
        console.log("selected a circle");
      });

十、方法

示例:

    bindEvents() {
      // 监听对象修改事件(包括旋转、缩放、位置变化等)
      this.canvas.on('object:modified', (e) => {
        const modifiedObject = e.target
        // 如果需要获取对象的任何属性(例如,位置、大小、旋转角度等)
        console.log('当前尺寸:', modifiedObject.width, modifiedObject.height)
        console.log('当前旋转角度:', modifiedObject.angle)
        console.log(
          '当前缩放比例:',
          modifiedObject.scaleX,
          modifiedObject.scaleY
        )
        console.log('当前位置:', modifiedObject.left, modifiedObject.top)
        const boundingRect = modifiedObject.getBoundingRect()
        // 输出旋转后的宽高
        console.log('旋转后的宽度:', boundingRect.width)
        console.log('旋转后的高度:', boundingRect.height)
      })
    },

这个写的不错,可以当中文参考,英语不错的可以直接看原文档

Fabric.js 中文文档_fabricjs中文文档-CSDN博客

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

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

相关文章

ActiveMQ 反序列化漏洞CVE-2015-5254复现

文章目录 一、产生原因二、利用条件三、利用过程四、PoC&#xff08;概念验证&#xff09;五、poc环境验证使用find搜索vulhub已安装目录打开activeMQ组件查看配置文件端口启动镜像-文件配置好后对于Docker 镜像下载问题及解决办法设置好镜像源地址&#xff0c;进行重启docker查…

给新ubuntu电脑配置远程控制环境和c++版本的opencv环境

目录 改用户密码安装ssh sever安装net-tools配置vscode安装vim配置C opencv1. 安装g, cmake, make2.安装opencv依赖库3.下载opencv源文件&#xff08;1&#xff09;方法一&#xff1a;官网下载&#xff08;2&#xff09;方法二&#xff1a;GitHub下载方式&#xff1a; 4. Cmake…

如何在 Debian 12 上安装和使用 Vuls 漏洞扫描器

简介 Vuls 是一款无代理、免费且开源的 Linux 和 FreeBSD 漏洞扫描器。Vuls 主要用 Go 语言编写&#xff0c;可以在任何地方运行。你可以在云端、本地和 Docker 上运行 Vuls&#xff0c;并且它支持主要的发行版。Vuls 提供高质量的扫描&#xff0c;支持多个漏洞数据库&#xf…

Python-装饰器(Decorator)详解

在python中&#xff0c;函数是一等公民&#xff0c;意味着函数可以像其他对象一样被赋值、传递参数、作为返回值等。装饰器的基本语法是使用符号将一个函数作为参数传递给另一个函数&#xff08;即装饰器&#xff09;。被装饰的函数在被调用时&#xff0c;实际上会执行装饰器函…

数据结构_拓扑排序

拓扑排序 &#xff08;所有点按照先后顺序排序&#xff09; 1.先找到入度为0的点&#xff0c;记录之后&#xff0c;删除这个点和它的出边&#xff1b; 2.若有两个可选&#xff0c;随便选择一个 例 a的入度为0,选a [a] 随便选一个 [a,e] 再找入度为0的点 再选c 最后选d 拓…

MinerU:PDF文档提取工具

目录 docker一键启动本地配置下载模型权重文件demo.py使用命令行启动GPU使用情况 wget https://github.com/opendatalab/MinerU/raw/master/Dockerfile docker build -t mineru:latest .docker一键启动 有点问题&#xff0c;晚点更新 本地配置 就是在Python环境中配置依赖和…

redis集群安装部署 redis三主三从集群

redis集群安装部署 redis三主三从集群 1、下载redis2、安装redis集群 三主三从3、配置redis开机自启动3.1、建立启动脚本3.2、复制多份redis启动脚本给集群使用3.3、添加可执行权限3.4、配置开机自启动 1、下载redis 本次redis安装部署选择当前最新的稳定版本7.4.1 下载链接: …

Fiddler简单使用

Fiddler使用方法 1.作用 接口测试&#xff0c;发送自定义请求&#xff0c;模拟小型的接口测试定位前后端bug&#xff0c;抓取协议包&#xff0c;前后端联调构建模拟测试场景&#xff0c;数据篡改&#xff0c;重定向弱网测试&#xff0c;模拟限速操作&#xff0c;弱网&#xf…

203.PyQt5_QTreeWidget_项处理_树形结构

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…

6.2 MapReduce工作原理

MapReduce工作原理涉及将大数据集分割成小块并行处理。Map任务读取数据块并输出中间键值对&#xff0c;而Reduce任务则处理这些排序后的数据以生成最终结果。MapTask工作包括读取数据、应用Map函数、收集输出、内存溢出时写入磁盘以及可选的Combiner局部聚合。ReduceTask工作则…

【线性代数】理解矩阵乘法的意义(点乘)

刚接触线性代数时&#xff0c;很不理解矩阵乘法的计算规则&#xff0c;为什么规则定义的看起来那么有规律却又莫名其妙&#xff0c;现在参考了一些资料&#xff0c;回过头重新总结下个人对矩阵乘法的理解&#xff08;严格来说是点乘&#xff09;。 理解矩阵和矩阵的乘法&#x…

Win11安装安卓子系统WSA

文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA&#xff1a;Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store&#xff0c;下拉框改为 …

Tree-of-Counterfactual Prompting for Zero-Shot Stance Detection

论文地址&#xff1a;Tree-of-Counterfactual Prompting for Zero-Shot Stance Detection - ACL Anthologyhttps://aclanthology.org/2024.acl-long.49/ 1. 概述 立场检测被定义为对文本中立场态度的自动推断。根据 Biber 和 Finegan (1988) 的定义&#xff0c;立场包含两个主…

轻松上手:使用 Vercel 部署 HTML 页面教程

&#x1f600; 在学习前端的过程中&#xff0c;部署项目往往是一个令人头疼的问题。然而&#xff0c;Vercel 为我们提供了一个便捷且免费的解决方案。 Vercel 是一个强大的云平台&#xff0c;专门用于前端项目的部署和托管。它不仅支持多种前端框架和静态网站生成器&#xff0…

QT从入门到精通(二) ——信号与槽机制

Qt 的信号与槽机制&#xff08;Signal and Slot&#xff09;是 Qt 框架 中用于对象间通信的核心机制之一。它允许对象之间进行松耦合的事件驱动式通信&#xff0c;尤其适合 GUI 应用程序 中的事件处理。 1. 基本概念 信号 (Signal) 当对象的状态发生变化时&#xff0c;它会发…

数据结构:Win32 API详解

目录 一.Win32 API的介绍 二.控制台程序(Console)与COORD 1..控制台程序(Console): 2.控制台窗口坐标COORD&#xff1a; 3.GetStdHandle函数&#xff1a; &#xff08;1&#xff09;语法&#xff1a; &#xff08;2&#xff09;参数&#xff1a; 4.GetConsoleCursorInf…

kubeadm_k8s_v1.31高可用部署教程

kubeadm_k8s_v1.31高可用部署教程 实验环境部署拓扑图**部署署架构****Load Balance****Control plane node****Worker node****资源分配&#xff08;8台虚拟机&#xff09;**集群列表 前置准备关闭swap开启ipv4转发更多设置 1、Verify the MAC address and product_uuid are u…

鸿蒙元服务项目实战:备忘录UI页面开发

前言 之前写过一篇关于元服务项目的上架流程&#xff0c;为了更好的了解及开发元服务&#xff0c;准备从0到1简单开发一个小项目&#xff0c;也希望能够帮助到刚刚介入到鸿蒙开发的同学&#xff0c;具体项目呢&#xff0c;也是十分的简单&#xff0c;就是一个小巧的备忘录项目&…

Linux-ubuntu点LED灯C语言版

​ 一&#xff0c;C语言点灯 1.寄存器配置 设置为SVC模式&#xff0c;复用寄存器设置GPIO1-IO003,设置电气属性&#xff0c;设置为输出模式。 2.软件 汇编语言对模式设置&#xff0c;并且将堆栈指针指向主程序&#xff1a; .global _start_start: /*设置为svr模式 */mrs …

SLM510A系列——24V,15到150mA单通道可调电流线性恒流LED驱动芯片

SLM510A 系列产品是单通道、高精度、可调电流线性恒流源的 LED 驱动芯片&#xff0c;在各种 LED 照明产品中非常简单易用。其在宽电压输入范围内&#xff0c;能保证极高的输出电流精度&#xff0c;从而在大面积的光源照明中&#xff0c;都能让 LED 照明亮度保持均匀一致。 由于…