fabric.js

news2024/12/21 14:59:16

目录

一、在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博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

白话AI大模型(LLM)原理

大模型&#xff08;例如 GPT-4或类似的深度学习模型&#xff09;是基于神经网络的系统&#xff0c;用于理解、生成文本、图像或其他数据类型。其工作原理可以分为以下几个核心步骤&#xff0c;我将通过易于理解的例子逐一解释。 1. 神经网络的基本概念 大模型背后有一个非常庞…

基于海思soc的智能产品开发(巧用mcu芯片)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于开发车规级嵌入式软件的同学来说&#xff0c;socmcu这样的组合&#xff0c;他们并不陌生。但是传统的工业领域&#xff0c;比如发动机、医疗或…

力扣438-找到字符串中所有字母异位词

力扣438-找到字符串中所有字母异位词 力扣438-找到字符串中所有字母异位词原题地址&#xff1a;https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/ 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词的子串&#x…

C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容

我们有一个中文录音文件.mp3格式或者是.wav格式&#xff0c;如果我们想要提取录音文件中的文字内容&#xff0c;我们可以采用以下方法&#xff0c;不需要使用Azure Speech API 密钥注册通过离线的方式实现。 1.首先我们先在NuGet中下载两个包 NAudio 2.2.1、Whisper.net 1.7.3…

数据可视化-2. 条形图

目录 1. 条形图适用场景分析 1.1 比较不同类别的数据 1.2 展示数据分布 1.3 强调特定数据点 1.4 展示时间序列数据的对比 1.5 数据可视化教育 1.6 特定领域的应用 2. 条形图局限性 3. 条形图图代码实现 3.1 Python 源代码 3.2 条形图效果&#xff08;网页显示&#…

基于Redis的网关鉴权方案与性能优化

文章目录 前言一、微服务鉴权1.1 前端权限检查1.2 后端权限检查1.3 优缺点 二、网关鉴权2.1 接口权限存储至Redis2.2 网关鉴权做匹配 总结 前言 在微服务架构中&#xff0c;如何通过网关鉴权结合Redis缓存提升权限控制的效率与性能。首先&#xff0c;文章对比了两种常见的权限…

Ansible 批量管理华为 CE 交换机

注&#xff1a;本文为 “Ansible 管理华为 CE 交换机” 相关文章合辑。 使用 CloudEngine - Ansible 批量管理华为 CE 交换机 wsf535 IP 属地&#xff1a;贵州 2018.02.05 15:26:05 总体介绍 Ansible 是一个开源的自动化运维工具&#xff0c;AnsibleWorks 成立于 2012 年&a…

使用自定义分光比对分束器进行建模

分束器将一束光分成两个或多个单独的光束。它常用于各种光学系统&#xff0c;例如显微镜、干涉仪和成像设备。分束器可以由不同的材料制成&#xff0c;通常涂有金属或介电材料的薄层&#xff0c;以达到所需的分束效果。分束器的两种流行形式是立方体和板式。立方体分束器由两个…

C++对象数组对象指针对象指针数组

一、对象数组 对象数组中的每一个元素都是同类的对象&#xff1b; 例1 对象数组成员的初始化 #include<iostream> using namespace std;class Student { public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<&l…

SQL进阶技巧:如何计算商品需求与到货队列表进出计划?

目录 0 需求描述 1 数据准备 2 问题分析 3 小结 累计到货数量计算 出货数量计算 剩余数量计算 0 需求描述 假设现有多种商品的订单需求表 DEMO_REQUIREMENT&#xff0c;以及商品的到货队列表 DEMO_ARR_QUEUE&#xff0c;要求按照业务需要&#xff0c;设计一个报表&#…

清远榉之乡托养机构为你深度分析:特殊碳水化合物饮食对自闭症的作用

在探索自闭症干预方法的道路上&#xff0c;各种尝试不断涌现。其中&#xff0c;特殊碳水化合物饮食引起了不少家长的关注。那么&#xff0c;特殊碳水化合物饮食对自闭症究竟有怎样的作用呢&#xff1f;今天&#xff0c;清远榉之乡托养机构为你深度分析。 榉之乡大龄自闭症托养机…

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

ONES 功能上新|ONES Copilot、ONES Wiki 新功能一览

ONES Copilot 可基于工作项的标题、描述、属性信息&#xff0c;对工作项产生的动态和评论生成总结。 针对不同类型的工作项&#xff0c;总结输出的内容有对应的侧重点。 应用场景&#xff1a; 在一些流程步骤复杂、上下游参与成员角色丰富的场景中&#xff0c;工作项动态往往会…

leecode494.目标和

这道题目第一眼感觉就不像是动态规划&#xff0c;可以看出来是回溯问题&#xff0c;但是暴力回溯超时&#xff0c;想要用动态规划得进行一点数学转换 class Solution { public:int findTargetSumWays(vector<int>& nums, int target) {int nnums.size(),bagWeight0,s…

python使用Flask框架创建一个简单的动态日历

0. 运行效果 运行代码&#xff0c;然后在浏览器中访问 http://127.0.0.1:5000/&#xff0c;将看到一个动态日历&#xff0c;能够通过点击按钮切换月份。 1. 安装 Flask 首先&#xff0c;确保你已经安装了Flask。如果没有&#xff0c;可以使用以下命令安装&#xff1a; pip i…

一键优化Linux服务器性能(One Click Optimization of Linux Server Performance)

服务器上线之一键优化Linux服务器性能 以下是一个简单的Shell脚本&#xff0c;用于执行服务器上线优化的一些基本步骤。请注意&#xff0c;这个脚本是基于一个通用的Linux服务器配置&#xff0c;您可能需要根据您的具体需求和环境进行调整。 功能如下&#xff1a; 1.关闭SEL…

【电脑技巧】将键盘的方向键映射为alt+i、k、j、l

最近感觉方向键太远了&#xff0c;想找个方法修改键盘映射&#xff0c;有几种方式可以实现 使用powertoys的键盘映射&#xff08;软件太大了&#xff0c;只为键盘映射不值得下这个&#xff09;使用autohotkey&#xff08;通过脚本的方式&#xff0c;可以打包成exe文件&#xf…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10

文件防泄漏 | 文件防泄漏软件解决方案分享,网络数据泄露防护系统

文件防泄漏 | 文件防泄漏软件解决方案分享&#xff0c;网络数据泄露防护系统 企业面临的一大挑战是数据安全和隐私保护。 网络数据泄露不仅会导致经济损失&#xff0c;还会损害企业的声誉和客户关系。 为了应对这一挑战&#xff0c;域智盾软件应运而生&#xff0c;成为众多企…

11篇--图像边缘检测

图像梯度 要学习图像边缘检测&#xff0c;要先了解图像梯度的概念&#xff0c;我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大&#xff08;不然不会有边缘呈现&#xff09;&#xff0c;所以给边缘附近的的梯度之变化很快&#xff0c;通过…