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

fabric.js介绍

fabric.js是可以简化canvas编写的js库,提供canvas缺少的对象模型,包含动画、数据序列和反序列化的等高级功能的js库,开源项目,在GitHub有很多人贡献。

官网:Fabric.js Javascript Canvas Library (fabricjs.com)

文档:JSDoc: Home (fabricjs.com)

示例:Demos — Fabric.js Javascript Canvas Library (fabricjs.com)

fabric.js笔记

对象

fabric.Circle 圆
fabric.Ellipse 椭圆
fabric.Line 直线
fabric.Polygon
fabric.Polyline
fabric.Rect 矩形
fabric.Triangle 三角形

方法

add(object) 添加
insertAt(object,index) 添加
remove(object) 移除
forEachObject 循环遍历
getObjects() 获取所有对象
item(int) 获取子项
isEmpty() 判断是否空画板
size() 画板元素个数
contains(object) 查询是否包含某个元素
fabric.util.cos
fabric.util.sin
fabric.util.drawDashedLine 绘制虚线
getWidth() setWidth()
getHeight()
clear() 清空
renderAll() 重绘
requestRenderAll() 请求重新渲染
rendercanvas() 重绘画板
getCenter().top/left 获取中心坐标
toDatalessJSON() 画板信息序列化成最小的json
toJSON() 画板信息序列化成json
moveTo(object,index) 移动
dispose() 释放
setCursor() 设置手势图标
getSelectionContext()获取选中的context
getSelectionElement()获取选中的元素
getActiveObject() 获取选中的对象
getActiveObjects() 获取选中的多个对象
discardActiveObject()取消当前选中对象
isType() 图片的类型
setColor(color) = canvas.set("full","");
rotate() 设置旋转角度
setCoords() 设置坐标

事件

object:added
object:removed
object:modified
object:rotating
object:scaling
object:moving
object:selected 这个方法v2已经废弃,使用selection:created替代,多选不会触发
before:selection:cleared
selection:cleared
selection:updated
selection:created
path:created
mouse:down
mouse:move
mouse:up
mouse:over
mouse:out
mouse:dblclick

常用属性

canvas.isDrawingMode = true; 可以自由绘制
canvas.selectable = false; 控件不能被选择,不会被操作
canvas.selection = true; 画板显示选中
canvas.skipTargetFind = true; 整个画板元素不能被选中
canvas.freeDrawingBrush.color = "#E34F51" 设置自由绘画笔的颜色
freeDrawingBrush.width 自由绘笔触宽度

IText的方法

selectAll() 选择全部
getSelectedText() 获取选中的文本
exitEditing() 退出编辑模式

 

图片去掉选中边框和旋转,且只能移动,不可操作

oImg.hasControls = false; 只能移动不能(编辑)操作
oImg.hasBorders = false; 去掉边框,可以正常操作
hasRotatingPoint = false; 不能被旋转
hasRotatingPoint 控制旋转点不可见

用法示例:

fabric.Image.fromURL("300.jpg", function (oImg) {

canvas.add(oImg);

oImg.hasControls = oImg.hasBorders = false;

});

动画

第一个参数是动画的属性,第二个参数是动画的最终位置,第三个参数是一个可选的对象,指定动画的细节:持续时间,回调,动效等。

第三个参数主要有

duration 默认为 500ms。可以用来改变动画的持续时间。

from 允许指定动画属性的起始值(如果我们不希望使用当前值)。

onComplete 动画结束之后的回调。

easing 动效函数。

绝对动画

用法示例:

let canvas = new fabric.Canvas("canvas");
let rect = new fabric.Rect({
    left400//距离左边的距离
    top200//距离上边的距离
    fill"green"//填充的颜色
    width200//宽度
    height200//高度
});
rect.animate("left"100, {
    onChange: canvas.renderAll.bind(canvas),
    duration1000,
});
canvas.add(rect);

相对动画(第二个参数通过+=,-=等来决定动画的最终效果)

rect.animate("left""+=100", {
    onChange: canvas.renderAll.bind(canvas),
    duration1000,
});

定义动画的动效函数

默认情况下,动画使用“easeInSine”动效执行。如果这不是你需要的,fabric 为我们提供了很多内置动画效果, fabric.util.ease 下有一大堆动效的选项。

常用的有easeOutBounce,easeInCubic,easeOutCubic,easeInElastic,easeOutElastic,easeInBounce 和 easeOutExpo等用法示例:

rect.animate("left"100, {
    onChange: canvas.renderAll.bind(canvas),
    duration1000,
    easing: fabric.util.ease.easeOutBounce,
});

图像滤镜

目前 Fabric 为我们提供了以下内置滤镜

BaseFilter 基本过滤器

Blur 模糊

Brightness 亮度

ColorMatrix 颜色矩阵

Contrast 对比

Convolute 卷积

Gamma 伽玛

Grayscale 灰度

HueRotation 色调旋转

Invert 倒置

Noise 噪音

Pixelate 像素化

RemoveColor 移除颜色

Resize 调整大小

Saturation 饱和

用法示例:

fabric.Image.fromURL(require("./aaa.jpeg"), (img) => {
    img.scale(0.5);
    // 添加滤镜
    img.filters.push(new fabric.Image.filters.Grayscale());
    // 图片加载完成之后,应用滤镜效果
    img.applyFilters();
    img.set({
        left300,
        top250,
    });
    canvas.add(img);
});

以原点为中心(左上角),缩放画布

      // 监听鼠标滚轮事件

      canvas.on('mouse:wheel', opt => {

        let delta = opt.e.deltaY // 滚轮向上滚一下是 -100,向下滚一下是 100

        let zoom = canvas.getZoom() // 获取画布当前缩放值

        // 控制缩放范围在 0.01~20 的区间内

        zoom *= 0.999 ** delta

        if (zoom > 20) zoom = 20

        if (zoom < 0.01) zoom = 0.01

        // 设置画布缩放比例

        canvas.setZoom(zoom)

      })

以鼠标指针为中心,缩放画布

  // 监听鼠标滚轮事件

  canvas.on('mouse:wheel', opt => {

    let delta = opt.e.deltaY // 滚轮向上滚一下是 -100,向下滚一下是 100

    let zoom = canvas.getZoom() // 获取画布当前缩放值

    // 控制缩放范围在 0.01~20 的区间内

    zoom *= 0.999 ** delta

    if (zoom > 20) zoom = 20

    if (zoom < 0.01) zoom = 0.01

    canvas.zoomToPoint(

      {

        x: opt.e.offsetX, // 鼠标x轴坐标

        y: opt.e.offsetY  // 鼠标y轴坐标

      },

      zoom // 最后要缩放的值

)

opt.e.preventDefault()

opt.e.stopPropagation()

  })

点击按钮控制缩放

// html     

<button @click="setZoom(0.1)">放大</button>

<button @click="setZoom(-0.1)">缩小</button>

// js

// 点击控制缩放

setZoom(val) {

    let zoom = this.canvas.getZoom() + parseFloat(val);

    zoom = Math.max(0.2, zoom);

    zoom = Math.min(5, zoom);

    let backPoint = this.canvas.getCenterPoint();

    console.log(backPoint);

    this.canvas.zoomToPoint(backPoint, zoom);

},

拖拽

canvas.selection = false;

      canvas.on('mouse:down', opt => { // 鼠标按下时触发

        let evt = opt.e

       

          canvas.isDragging = true // isDragging 是自定义的,开启移动状态

          canvas.lastPosX = evt.clientX // lastPosX 是自定义的

          canvas.lastPosY = evt.clientY // lastPosY 是自定义的

      })

      canvas.on('mouse:move', opt => { // 鼠标移动时触发

        console.log('查看e',opt);

        if (canvas.isDragging) {

          let evt = opt.e

          let vpt = canvas.viewportTransform // 聚焦视图的转换

          vpt[4] += evt.clientX - canvas.lastPosX

          vpt[5] += evt.clientY - canvas.lastPosY

          canvas.requestRenderAll() // 重新渲染

          canvas.lastPosX  = evt.clientX

          canvas.lastPosY  = evt.clientY

           canvas.requestRenderAll() // 重新渲染

        }

      })

      canvas.on('mouse:up', opt => { // 鼠标松开时触发

        canvas.setViewportTransform(canvas.viewportTransform) // 设置此画布实例的视口转换  

        canvas.isDragging = false // 关闭移动状态

      })

画布保存与恢复

var json = canvas.cloneJSON(); // 将画布状态序列化为 JSON 对象

console.log(json); // 可以将此 JSON 对象保存到服务器或进行其他操作

// 从 JSON 恢复画布状态

var newCanvas = new fabric.Canvas('newCanvas');

newCanvas.loadFromJSON(json); // 从 JSON 对象恢复画布状态

背景图

fabric.Image.fromURL('../../images/bg.jpg', img => {

  canvas.setBackgroundImage(img)

canvas.backgroundVpt=false;//背景图锁定,即不随画布缩放而改变

  canvas.renderAll()

})

设置完背景图再执行 canvas.renderAll() 才会重新渲染,不然画面看上去是没效果的。

相关文章:

fabric.js介绍

fabric.js是可以简化canvas编写的js库&#xff0c;提供canvas缺少的对象模型&#xff0c;包含动画、数据序列化和反序列化的等高级功能的js库&#xff0c;开源项目&#xff0c;在GitHub有很多人贡献。 官网&#xff1a;Fabric.js Javascript Canvas Library (fabricjs.com) 文档…...

YOLOv5源码中的参数超详细解析(3)— 训练部分(train.py)| 模型训练调参

前言:Hello大家好,我是小哥谈。YOLOv5项目代码中,train.py是用于模型训练的代码,是YOLOv5中最为核心的代码之一,而代码中的训练参数则是核心中的核心,只有学会了各种训练参数的真正含义,才能使用YOLOv5进行最基本的训练。🌈 前期回顾: YOLOv5源码中的参数超详细解析…...

Linux高性能编程学习-TCP/IP协议族

一、TCP/IP协议族结构与主要协议 分层&#xff1a;数据链路层、网络层、传输层、应用层 1. 数据链路层 功能&#xff1a;实现网卡驱动程序&#xff0c;处理数据在不同物理介质的传输 协议&#xff1a; ARP&#xff1a;将目标机器的IP地址转成MAC地址RARP&#xff1a;将MAC地…...

用爬虫代码爬取高音质音频示例

目录 一、准备工作 1、安装Python和相关库 2、确定目标网站和数据结构 二、编写爬虫代码 1、导入库 2、设置代理IP 3、发送HTTP请求并解析HTML页面 4、查找音频文件链接 5、提取音频文件名和下载链接 6、下载音频文件 三、完整代码示例 四、注意事项 1、遵守法律法…...

深度学习与计算机视觉(一)

文章目录 计算机视觉与图像处理的区别人工神经元感知机 - 分类任务Sigmoid神经元/对数几率回归对数损失/交叉熵损失函数梯度下降法- 极小化对数损失函数线性神经元/线性回归均方差损失函数-线性回归常用损失函数使用梯度下降法训练线性回归模型线性分类器多分类器的决策面 soft…...

【vector题解】杨辉三角 | 删除有序数组中的重复项 | 只出现一次的数字Ⅱ

杨辉三角 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1…...

金字塔切分注意力模块PSA学习笔记 (附代码)

已有研究表明&#xff1a;将注意力模块嵌入到现有CNN中可以带来显著的性能提升。比如&#xff0c;SENet、BAM、CBAM、ECANet、GCNet、FcaNet等注意力机制均带来了可观的性能提升。但是&#xff0c;目前仍然存在两个具有挑战性的问题需要解决。一是如何有效地获取和利用不同尺度…...

Jenkins自动化测试

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 它…...

python 字典dict和列表list的读取速度问题, range合并

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 python 字典和列表的读取速度问题 最近在进行基因组数据处理的时候&#xff0c;需要读取较大数据&#xff08;2.7G&#xff09;存入字典中&#xff0c; 然后对被处理数据进行字典key值的匹配&#xff0c;在被处理文件中每次…...

测试用例的设计方法(全):等价类划分方法

一.方法简介 1.定义 是把所有可能的输入数据,即程序的输入域划分成若干部分&#xff08;子集&#xff09;,然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。 2.划分等价类&#xff1a; 等价类是指某个输入域的…...

Office技巧(持续更新)(Word、Excel、PPT、PowerPoint、连续引用、标题、模板、论文)

1. Word 1.1 标题设置为多级列表 选住一级标题&#xff0c;之后进行“定义新的多级列表” 1.2 图片和表的题注自动排序 正常插入题注后就可以了。如果一级标题是 “汉字序号”&#xff0c;那么需要对题注进行修改&#xff1a; 从原来的 图 { STYLEREF 1 \s }-{ SEQ 图 \* A…...

Java实现ORM第一个api-FindAll

经过几天的业余开发&#xff0c;今天终于到ORM对业务api本身的实现了&#xff0c;首先实现第一个查询的api 老的C#定义如下 因为Java的泛型不纯&#xff0c;所以无法用只带泛型的方式实现api&#xff0c;对查询类的api做了调整&#xff0c;第一个参数要求传入实体对象 首先…...

HFSS笔记——求解器和求解分析

文章目录 1、求解器2、求解类型3、自适应网格剖分4、求解频率选择4.1 求解设置项的含义4.2 扫频类型 1、求解器 自从ANSYS将HFSS收购后&#xff0c;其所有的求解器都集成在一起了&#xff0c;点击Project&#xff0c;会显示所有的求解器类型。 其中&#xff0c; HFSS design&…...

jenkins配置gitlab凭据

下载Credentials Binding插件&#xff08;默认是已经安装了&#xff09; 在凭据配置里添加凭据类型 点击保存 Username with password&#xff1a; 用户名和密码 SSH Username with private 在凭据管理里面添加gitlab账号和密码 点击全局 点击添加凭据&#xff08;版本不同…...

0基础学习PyFlink——用户自定义函数之UDTF

大纲 表值函数完整代码 在《0基础学习PyFlink——用户自定义函数之UDF》中&#xff0c;我们讲解了UDF。本节我们将讲解表值函数——UDTF 表值函数 我们对比下UDF和UDTF def udf(f: Union[Callable, ScalarFunction, Type] None,input_types: Union[List[DataType], DataTy…...

【Java 进阶篇】Java Request 原理详解

在网络应用开发中&#xff0c;HTTP请求是一项常见而关键的任务。当我们使用Java编写网络应用时&#xff0c;了解HTTP请求的工作原理变得至关重要。本文将详细介绍Java中HTTP请求的原理&#xff0c;包括请求的结构、发送请求的方法以及处理请求的过程。 HTTP请求的基本结构 HT…...

13 结构性模式-装饰器模式

1 装饰器模式介绍 在软件设计中,装饰器模式是一种用于替代继承的技术,它通过一种无须定义子类的方式给对象动态的增加职责,使用对象之间的关联关系取代类之间的继承关系. 2 装饰器模式原理 //抽象构件类 public abstract class Component{public abstract void operation(); }…...

支持向量机(SVM)

一. 什么是SVM 1. 简介 SVM&#xff0c;曾经是一个特别火爆的概念。它的中文名&#xff1a;支持向量机&#xff08;Support Vector Machine, 简称SVM&#xff09;。因为它红极一时&#xff0c;所以关于它的资料特别多&#xff0c;而且杂乱。虽然如此&#xff0c;只要把握住SV…...

Rabbitmq----分布式场景下的应用

服务异步通信-分布式场景下的应用 如果单机模式忘记也可以看看这个快速回顾rabbitmq,在做学习 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一…...

springboot + redis实现签到与统计功能

在很多项目中都会有签到与统计功能&#xff0c;最容易想到的方案是创建一个签到表来记录每个用户的签到记录&#xff0c;比如设计一个mysql数据库表&#xff1a; CREATE TABLE tb_sign id bigint(20) unsigned NOT NULL AUTOINCREMENT COMMENT 主键, user_id bigint(20) unsig…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

ubuuntu24.04 编译安装 PostgreSQL15.6+postgis 3.4.2 + pgrouting 3.6.0 +lz4

文章目录 下载基础包下载源码包编译 PG编译 postgis编译安装 pgrouting下载源码包配置编译参数编译安装 初始化数据库建表并检查列是否使用了 lz4 压缩算法检查 postgis 与 pgrouting 是否可以成功创建 下载基础包 sudo apt update && sudo apt upgrade -y sudo apt i…...

【汇编逆向系列】四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型

一、汇编代码 上一节开始&#xff0c;讲到了很多debug编译独有的汇编方式&#xff0c;为了更好的区分release的编译器优化和debug的区别&#xff0c;从本章节开始将会提供debug和release的汇编用作对比 Debugb编译 single_double_param:00000000000000A0: F2 0F 11 44 24 08…...