Fabric.js

前端开源的canvas工具库Fabric.js / 创建自定义箭头对象},// 绘制箭头头部ctx.save();ctx.fill();});// 添加到画布});// 添加自定义控制点x: 0.5,y: -0.5,// 自定义处理逻辑},// 自定义渲染},}); 阅读详情

Fabric.js是什么

Fabric.js 是一个简化HTML5 Canvas开发的Javascript库,Fabric.js提供了HTML5 Canvas本身缺失的对象模型、交互层、SVG解析器以及其他一整套工具。它是一个完全开源的项目,在MIT下获得授权,多年来一直在维护,近期要发布4.0版本,支持自定义controls。

Fabric.js能做什么

在Canvas画布上创建、填充图形(包括图片、文字、规则图形和复杂路径组成图形)。
给图形填充渐变颜色。
组合图形(包括组合图形、图形文字、图片等)。
设置图形动画及用户交互,生成的对象自带拖拉拽功能。
JSON, SVG数据的序列化和反序列化。

为什么使用Fabric.js

HTML5 Canvas提供了完整的画布,可以轻松的在画布上绘制简单的图形、制作简单的动画,但是HTML5 Canvas提供的API过于低级,且操作基于上下文,因此在绘制复杂图形或者需要实现用户交互时,就显得不是那么方便了。Fabric.js在HTML5 Canvas原生API之上,提供完整的对象模型,由Fabric.js来管理HTML5 Canvas画布的状态和渲染,用户基于具体的对象,来编写代码,完成所需功能的开发(类似于面向过程和面向对象)。“Talk is cheap. Show me the code”,下面通过代码来看看用HTML5 Canvas原生方法和用Fabric.js分别实现在画布上画一个矩形这一功能。

用HTML5 Canvas的原生方法实现

// 获取canvas元素
var canvasEl = document.getElementById('c');
// 获取上下文
var ctx = canvasEl.getContext('2d');
// 设置填充颜色
ctx.fillStyle = 'red';
// 在100,100点创建20x20的矩形
ctx.fillRect(100, 100, 20, 20);

在线演示地址:https://codepen.io/liblack/pen/LYpaMwa

用Fabric.js实现相同的功能:

// 创建原生canvas元素的包装类(‘c’canvas元素的id)
var canvas = new fabric.Canvas('c');

// 创建一个矩形对象
var rect = new fabric.Rect({
  left: 100,
  top: 100,
  fill: 'red',
  width: 20,
  height: 20
});

// 添加矩形到画布上
canvas.add(rect);

在线演示地址:https://codepen.io/liblack/pen/PoPLVwZ

由上面例子,可以看到使用HTML5 Canvas原生方法是对context(代表整个画布位图的对象)进行操作,而使用Fabric.js,我们是对对象操作,只需要去实例化对象,设置对象的属性,然后将它们添加到canvas中。到这里,可能还感受不到Fabric对比原生Canvas方法的优势,下面可以完成这样的功能,即在刚才绘制的矩形的基础上,将矩形位置移动到(10,10)点上。
这样的功能,在Canvas原生方法上实现,需要先把原来的矩形从画布上清除,然后在(10,10)位置重新绘制一个矩形,以此来实现矩形移动这样的功能。

// 擦除之前的矩形(这里是擦除了整个canvas区域)
ctx.clearRect(0, 0, canvasEl.width, canvasEl.height);
// 重新绘制矩形
ctx.fillRect(20, 50, 20, 20);

听起来是不是很蹩脚?是的,使用Canvas原生方法时,就像是个带橡皮檫的笔刷,在画布上绘制图形时,是笔刷在画布上移动,绘制出的图形就是笔刷移动的整个痕迹,而想把绘制好的图形移动到其他地方,只好用橡皮檫擦掉,然后在新位置重新绘制。
相应的,使用Fabric.js实现该功能时,只需要改变矩形对象的属性,然后重新刷新(渲染)画布即可。

rect.set({ left: 20, top: 50 });
canvas.renderAll();

Canvas对象

fabric.Canvas作为元素的包装器,创建fabric.Canvas对象如下:

var canvas = new fabric.Canvas('...')

它接收一个元素的id,并返回一个fabric.Canvas 的实例。fabric.Canvas对象,并不是DOM里的元素,如果需要直接控制DOM,或者对应的context,需要通过相应API去获取。

var canvasElement = document.getElementById(canvasEle);
var ctx = canvasElement.getContext("2d");
fabric.Canvas对象负责管理画布上绘制的所有对象,可以将对象添加到fabric.Canvas对象,也可以从fabric.Canvas获取或删除对象。

var canvas = new fabric.Canvas('c');
var rect = new fabric.Rect();

canvas.add(rect); // 添加对象

canvas.item(0); ///获取之前添加的fabric.Rect(第一个对象)
canvas.getObjects(); ///获取画布上的所有对象(rect将是第一个也是唯一一个)
canvas.remove(rect); ///删除之前添加的对象删除

fabric.Canvas对象可以对画布进行配置。比如需要为整个画布设置背景颜色或图像?需要将所有内容剪裁到特定区域?设置不同的宽度/高度?指定画布是否是交互式的?所有这些选项(及其他)都可以在fabric.Canvas对象上进行设置,可以在创建时或之后进行设置。

var canvas = new fabric.Canvas('c', {
  backgroundColor: 'rgb(100,100,100,200)',
  selectionColor:'blue',
  selectLineWidth: 2
  // ...
});

// 或

var canvas = new fabric.Canvas('c');
canvas.setBackgroundImage('http://...');
canvas.onFpsUpdate = function(){ /* ...... */ };
// ...

注意这种创建对象的形式,Fabric.js里基本上都是类似的,类名表示要创建的对象类型,第一个参数是必要的数据,第二个参数是各种选项。

所有对canvas的修改,包括在其中添加删除对象,以及对象参数的修改,都需要调用渲染方法才能显示出来:

canvas.renderAll();

Objects基本图形
Fabric.js提供了7种基本图形,下面是图形对应的类,

fabric.Circle
fabric.Ellipse
fabric.Line
fabric.Polygon
fabric.Polyline
fabric.Rect
fabric.Triangle

所有基本形状,都可以通过类实例的属性和方法来控制它们的位置、颜色、大小等样式。所有类都继承自fabric.Object类,有一些公共的属性和方法。

创建

下面是画线的例子(给出两个顶点坐标):

var line =  new fabric.Line([x1, y1, x2, y2], {
    strokeWidth: 2, //线宽
    stroke: rgba(255,0,0,0.8), //线的颜色
    selectable: false
});
canvas.add(line);

画圆的例子(顶点和半径是在选项里的),这里left和top其实就是(x,y),应该是借用了css里的命名。

var circle =  new fabric.Circle({
    radius: 2,
    left: left,
    top: top,
    originX: 'center',
    originY: 'center',
    fill: rgba(0,200,0,0.8), 
    strokeWidth: 1,
    stroke: rgba(255,0,0,0.8),
    selectable: false
});
canvas.add(circle);

从这里可以看出,和创建canvas类似,第一个参数是这个类专用的(比如画直线的时候传的起止点坐标),第二个参数是通用选项,如果没有专用参数,那么第一个参数就直接是通用选项。所有创建完的形状,只有通过canvas.add方法加入,才能显示出来。

控制

left和top是每种Object都有的属性,至于它到底指图形中哪一个点的坐标,由originX和originY这组参数决定,它们相当于文本编辑软件里的对齐方式,originX有三种可选值:left,center, right;originY也有三种可选值:top, center, bottom。

它们的示意图如下:
http://fabricjs.com/test/misc/origin.html

如果希望对象的默认原点在中心,可以这样设置:

fabric.Object.prototype.originX = fabric.Object.prototype.originY = 'center'

width和height也是可以直接存取的属性,顾名思义,表示长和宽(所有形状都是有外接矩形的,所以可以用长和宽来控制大小)。除了上面那几个可以直接存取的属性,大部分属性需要使用get/set方法读写,比如:

line.left = pointer.x;
line.top = pointer.y;
line.set('stroke', startColor);
line.set('height', 20);

Image对象

Image跟其他形状类似,都是fabric.Object的子类,最大的区别在于,图像文件的加载是异步的,所以对Image的后续操作,都要在回调中完成。

fabric.Image.fromURL('my_image.png', function(oImg) {
  // scale image down, and flip it, before adding it onto canvas
  oImg.scale(0.5).set('flipX, true);
  canvas.add(oImg);
});

Path对象

在Fabric.js中的Path代表了一个形状的轮廓,它可以被填充、描边和修改。Path由一系列的命令组成,本质上是模仿一支笔从一个点到另一个点。在“move”, “line”, “curve”, or “arc”等命令的帮助下,Path可以形成非常复杂的形状。而在Paths(PathGroup’s)组的帮助下,Path的能实现更多的复杂图形。
Fabric.js中的Path与SVG的 元素非常相似。它们使用相同的命令集,可以从 元素中创建,并将其序列化。我们稍后会更深入地研究序列化和SVG解析,但现在值得一提的是,实践中很少会手动创建Path实例。相反,更多的是使用Fabric.js的内置SVG解析器。
手工创建一个简单的Path对象。

var path = new fabric.Path('M 0 0 L 200 100 L 170 200 z');
path.set({ left: 120, top: 120 });
canvas.add(path);

实例化 fabric.Path 对象,传递给它一串路径指令。虽然看起来很隐蔽,但实际上很容易理解。”M “代表 “移动 “指令,告诉隐形笔要移动到0,0点。”L “代表 “线”,让笔画一条线到200,100点。然后,另一个 “L “代表 “线”,让笔画一条线到170,200点。最后,”z “告诉画笔关闭当前路径并最终确定形状。结果,得到的是一个三角形的形状。

由于 fabric.Path 就像 Fabric 中的其他对象一样,我们还可以改变它的一些属性。但我们还可以对它进行更多的修改。

...
var path = new fabric.Path('M 0 0 L 300 100 L 200 300 z');
...
path.set({ fill: 'red', stroke: 'green', opacity: 0.5 });
canvas.add(path);

实践中,更多是直接使用fabric.loadSVGFromString 或 fabric.loadSVGFromURL 方法来加载整个 SVG 文件,然后让 Fabric 的 SVG 解析器来完成所有 SVG 元素的解析工作,并创建相应的 Path 对象。

Events事件

事件驱动的架构是一个框架灵活性和可扩展性的基础。Fabric.js提供了一个广泛的事件系统,覆盖了低级的 “鼠标”事件到高级的对象事件。
这些事件使我们能够监控到到画布上发生的各种动作的不同时刻。比如想知道鼠标被按下的时间,只需监听”mouse:down”事件就可以了。想知道对象何时被添加到画布上,只需要监听”object:added “事件就在那里。

事件API非常简单,类似于jQuery、Underscore.js或其他流行的JS库。有on方法来初始化事件监听器,有off方法来移除事件监听器。

下面一个实际的例子。

var canvas = new fabric.Canvas('...');
canvas.on('mouse:down', function(options) {
  console.log(options.e.clientX, options.e.clientY);
});

上面例子演示了在canvas上添加”mouse:down”事件监听器,并给它设置事件处理程序,它将记录事件发生的坐标。事件处理程序会接收一个选项对象,它有两个属性:e—原始事件,和target—画布上的点击对象(如果有的话)。该事件在任何时候都是存在的,但目标只有在实际点击了画布上的某个对象后才会存在。target也只有在有意义的情况下才会传递给事件的处理程序,例如,对于 “mouse:down”事件,但对于 “after:render”事件(表示整个画布被重新绘制),target不会传递给事件处理程序。

canvas.on('mouse:down', function(options) {
  if (options.target) {
    console.log('一个对象被点击了!', options.target.type);
  }
});

如果你点击了一个对象,上面的例子会输出 “一个对象被点击了!”。还会显示被点击的对象类型。

那么,在Fabric.js中还有鼠标级的事件:“mouse:down”, “mouse:move”, 和”mouse:up”。通用的事件: “after:render”。选择相关的事件: “before:selection:cleared”,”selection:create”,”selection:cleared”。对象相关的事件: “object:moded”、”object:selected”、”object:moving”、”object:scaling”、”object:rotating”、”object:additional “和 “object:detter”。
注意,像”object:moving”(或”object:scaling”)这样的事件在每次对象移动(或缩放)时,即使是一个像素点的移动,也会连续地被触发。另一方面,像 “object:modified” 或 “selection:create”这样的事件只在操作(对象修改或选区创建)结束时才会被触发。如果将事件直接附加到画布上的(canvas.on(‘mouse:down’, …)),这意味着事件被覆盖到了canvas实例上。如果一个页面上有多个画布,可以给每个画布附加不同的事件监听器。它们都是独立互不影响的。
为了方便,Fabric.js将事件系统做得更进一步,允许直接将监听器附加到具体对象上。如下例子。

var rect = new fabric.Rect({ width: 100, height: 50, fill: 'green' });
rect.on('elected', function() {
  console.log('选择了一个矩形');
});

var circle = new fabric.Circle({ radius: 75, fill: 'blue' });
circle.on('selected', function() {
  console.log('选择了一个圆圈');
});

上述例子直接给矩形和圆的实例附加事件监听器,使用的是 “selected “事件,而不是 “object:selected”。同样的,可以在对象上使用 “modified”事件(当附加到canvas上时使用 “object:modified”)、”rotating”事件(当附加到canvas时使用 “object:rotating”)等等。

Groups组

fabric.Group是Fabric.js提供的强大的功能之一。使用Groups可以将任何Fabric对象组合成一个单一实体,这样就能够将这些对象作为一个单一的单元来处理。用鼠标将画布上的任意数量的Fabric对象进行组合,一旦组合后,这些对象都可以一起移动甚至修改。它们组成了一个组。我们可以对该组进行缩放、旋转,甚至改变其呈现属性—颜色、透明度、边框等。

下面创建一个由2个对象组成的组,即圆圈和文本。

var circle = new fabric.Circle({
  radius: 100,
  fill: '#eef',
  scaleY: 0.5,
  originX: 'center',
  originY: 'center'
});

var text = new fabric.Text('hello world', {
  fontSize: 30,
  originX: 'center',
  originY: 'center'
});

var group = new fabric.Group([ circle, text ], {
  left: 150,
  top: 100,
  angle: -10
});

canvas.add(group);

组成组以后,依旧可以对每个对象操作,改变对象的属性和状态。

group.item(0).set('fill', 'red');
group.item(1).set({
  text: 'trololo',
  fill: 'white'
});

Serialization序列化

为构建某种有状态的应用程序,允许用户将canvas内容的结果保存在服务器上,或者将内容流媒体化到不同的客户端。Fabric.js提供了canvas序列化/解序列化支持。

toObject, toJSON

Fabric中序列化的主要方法是 fabric.Canvas#toObject()和 fabric.Canvas#toJSON()方法。让我们来看一个简单的例子,首先对一个空画布进行序列化。

var canvas = new fabric.Canvas('c');
JSON.stringify(canvas); // '{"objects":[], "background": "rgba(0,0,0,0,0)"}'

使用的是ES5 JSON.stringify()方法,如果传入的对象存在toJSON方法,那么这个方法就会隐含地调用toJSON方法。由于Fabric中的canvas实例有toJSON方法,所以调用JSON.stringify(canvas)方法和调用JSON.stringify(canvas.toJSON())一样。

注意,返回的字符串表示空的canvas。它是JSON格式的,本质上由 “objects”和”background”属性组成。”objects”目前是空的,因为canvas上没有任何东西,而 background 有一个默认的透明值(“rgba(0,0,0,0,0)”)。
当在canvas上添加了具体对象后:

canvas.add(new fabric.Circle({
  left: 100,
  top: 100,
  radius: 50,
  fill: 'red'
}));
console.log(JSON.stringify(canvas));

序列化后结果如下:

'{"objects":[{"type":"rect","left":50,"top":50,"width":20,"height":20,"fill":"green","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,
"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,
"transparentCorners":true,"perPixelTargetFind":false,"rx":0,"ry":0},{"type":"circle","left":100,"top":100,"width":100,"height":100,"fill":"red",
"overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,
"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"radius":50}],"background":"rgba(0, 0, 0, 0)"}'

toSvg

Fabric.js支持将canvas画布序列化为SVG格式的文本。

canvas.add(new fabric.Rect({
  left: 50,
  top: 50,
  height: 20,
  width: 20,
  fill: 'green'
}));
console.log(canvas.toSVG());

序列化结果如下:

'<?xml version="1.0" standalone="no" ?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="800" height="700" xml:space="preserve"><desc>Created with Fabric.js 0.9.21</desc>
<rect x="-10" y="-10" rx="0" ry="0" width="20" height="20" style="stroke: none; stroke-width: 1; stroke-dasharray: ; fill: green; opacity: 1;" transform="translate(50 50)" /></svg>'

Deserialization反序列化, SVG Parser SVG解析器

与序列化类似,反序列化是从字符串中加载canvas,与序列化时相对应的,也有两种方法:从JSON文本反序列和从SVG文本反序列化。当使用JSON表示时,有 fabric.Canvas#loadFromJSON和 fabric.Canvas#loadFromDatalessJSON方法。当使用SVG时,

有 fabric.loadSVGFromURL和 fabric.loadSVGFromString两个方法。

var canvas = new fabric.Canvas();

canvas.loadFromJSON('{"objects":[{"type":"rect","left":50,"top":50,"width":20,"height":20,"fill":"green","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,
"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,
"perPixelTargetFind":false,"rx":0,"ry":0},{"type":"circle","left":100,"top":100,"width":100,"height":100,"fill":"red","overlayFill":null,"stroke":null,"strokeWidth":1,
"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,
"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"radius":50}],"background":"rgba(0, 0, 0, 0)"}');
下移:canvas.sendBackwards(obj)
上移:canvas.bringForward(obj)
置顶:canvas.bringToFront(obj)
置底:canvas.sendToBack(obj)

更多资源

fabric.js官网:http://fabricjs.com/
fabric.js源码:https://github.com/fabricjs/fabric.js
fabric.js应用案例:https://printio.ru/tees/new_v2
HTML5 Canvas资料:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial

Fabric.js 中文文档 Fabric.js 是一个功能强大的 canvas 库,它提供了一套丰富的 API 来操作 canvas 元素和上面的对象。通过配置项、方法和事件,开发者可以轻松地在网页上实现复杂的图形和交互设计。上述文档简要介绍了 Fabric.js 的一些基本用法和配置,更多高级功能和细节请参考官方文档。 阅读详情

相关推荐

fabricjs 插件使用

我将向您介绍Fabric.js —一个功能强大JavaScript库,可以轻松处理HTML5 canvas元素。 Fabric为画布提供了丢失的对象模型,以及SVG解析器,交互性层和一整套其他必不可少的工具。

长路漫漫其修远兮 4033

fabric.js 中文教程第一部分

fabric.js基础概念,fabric.js入门

sj_wl的博客 1万+

Fabric.js的学习

简介 Fabric.js - 一个强大的 Javascript 库,它让使用 HTML5 画布变得轻而易举。Fabric 为画布提供了一个缺失的对象模型,以及一个 SVG 解析器、交互层和一整套其他不可或缺的工具。它是一个完全开源的项目。 如今, Canvas使我们能够在网络上创建一些绝对令人惊叹的图形。但它提供的 API令人失望地低级。如果我们只是想在画布上绘制一些基本形状而忘记它们,那是一回事。但是,一旦需要进行任何类型的交互、随时更改图片或绘制更复杂的形状,情况就会发生巨大变化。 Fabr...

专注于技术,分享实战经验,探索技术边界,用代码构建更美的数字世界。 1045

fabric.js学习

1.fabric[ˈfæbrɪk']是一个功能强大的运行在的JavaScript库,。fabric为canvas提供了一个交互式对象模型,通过简洁的api就可以在画布上进行丰富的操作。3.在使用过程发现文档阅读比较困难,因此自己在写的时候顺便总结一下,便于后续参考。

过客如期的博客 9816

值得苦练的100道Python经典练手题(全网最全,附详细答案,建议收藏)

这100道Python练习题涵盖了从基础语法到高级算法、从数据库操作到Web开发的各个方面,是备考数据库系统工程师的绝佳素材。建议按照章节顺序逐一练习,遇到难点可反复钻研,真正掌握每一道题背后的知识点。通过这些练习,不仅能提升Python编程能力,还能加深对数据库系统原理的理解,为考试和实际工作打下坚实基础。

yue_yun_的博客 9388

深度学习十大算法之Word2Vec

Word2Vec的提出,标志着词嵌入技术的一次重大进步。Word2Vec是一种高效的词嵌入模型,由Google的研究团队于2013年开发。它使用一种称为神经网络的机器学习方法,通过学习大量文本数据,生成能够表达词语间丰富语义关系的词向量。Word2Vec的核心优势在于它能够捕捉到词语之间的细微关系。例如,在Word2Vec模型中,可以通过计算向量之间的距离来估计词语之间的相似度。这不仅能帮助理解语言的复杂性,还可以应用于各种NLP任务,如机器翻译和搜索引擎优化。

第欧根尼的酒桶的博客 1864

【亲测免费】 Fabric.js 图像编辑器 - 开源JavaScript神器

Fabric.js 图像编辑器 - 开源JavaScript神器 项目基础介绍 Fabric.js 图像编辑器 是一个基于 Fabric.js 库构建的强大的Web图像编辑工具。这个开源项目由CodeHole7维护,采用JavaScript为主要编程语言,并依赖于jQuery v3.5.1及spectrum-colorpicker2等库,以支持更丰富的交互体验。它允许用户在浏览器上绘制基本形状、手...

gitblog_07556的博客 930

俄罗斯方块 C++控制台版

一、创建方块 wstring tetromino[7]; tetromino[0].append(L"..X...X...X...X."); // Tetronimos 4x4 tetromino[1].append(L"..X..XX...X....."); tetromino[2].append(L".....XX..XX....."); tetromino[3].append(L"..X..XX..X......"); tetromino...

一只大鸽子的博客 1622

【GitHub项目推荐--Fabric.js:强大的JavaScript Canvas库】

​Fabric.js​ 是一个功能强大且简单易用的JavaScript HTML5 Canvas库,它提供了丰富的图形操作功能和直观的API接口,让开发者能够轻松创建复杂的Canvas应用。作为开源项目,Fabric.js已经成为Web图形处理领域的重要工具。🔗 ​GitHub地址🚀 ​核心价值​:Canvas图形 · SVG解析 · 交互操作 · 动画效果 · 开源免费​项目背景​:​Canvas需求​:解决原生Canvas API复杂难用的问题​图形交互​:提供丰富的图形交互功能​跨平台。

j8267643的博客 920

STM32 USB键盘实现指南

在STM32上实现键盘功能可以通过USB HID(人机接口设备)协议来实现,使STM32设备能被计算机识别为标准键盘。通过上述步骤,您可以在STM32上实现一个功能完整的USB键盘。关键点包括:正确配置USB HID设备实现键盘矩阵扫描处理按键事件并生成HID报告优化按键响应和消抖处理添加额外功能如宏键和LED反馈这个实现可以作为基础,进一步扩展为游戏键盘、宏键盘或特殊输入设备。

suny8的专栏 968

26.Labview波形图、XY图、强度图使用精讲

1. 波形图基础概念,如何使用,1.1 波形图与波形图表1.2 XY图如何设计、如何使用?1.3 强度图原理、如何使用、使用案例;2. 图形的参数设置2.1 波形图及波形图表的外观设计2.2 XY图的前面板设计2.3 强度图属性设置。

关注我,更多技术问题欢迎私聊~ 7500

Fabric.js – 简单而强大的 JavaScript Canvas 库

Fabric.js 是一个简单而强大的 JavaScript Canvas 库,在 HTML5 Canvas 元素之上提供了互动的对象模型,同时还包含 Canvas-to-SVG 解析器。 您可能感兴趣的相关文章 使用 Toolbar.js 实现超酷的 Tooltip 风格工具栏 Textillate.js – 实现 CSS3 文本动画的简单插件 使用 ThreeSixty 创建

465

企业AI数据资产评估的自动化工具:AI应用架构师的使用指南

在AI驱动的企业数字化转型中,数据资产是支撑模型训练、业务决策的核心燃料。然而,80%的AI项目失败源于数据问题——低质量数据导致模型偏差、未评估的风险引发合规危机、价值不明确的数据浪费资源。手动数据资产评估效率低、易出错,无法满足规模化AI应用需求。本文将以AI应用架构师的视角,拆解企业数据资产评估的核心逻辑,用"餐厅选食材"的生活化比喻解释复杂概念,结合自动化工具的技术原理与实战案例,教你如何从0到1搭建数据资产评估体系。无论是数据质量检测、价值量化还是风险防控,你都能找到可落地的工具方案与实践步骤。

2502_91592937的博客 1629

Fabric.js 图片编辑器教程

Fabric.js 图片编辑器教程 1. 项目介绍 Fabric.js 是一个强大的 JavaScript HTML5 Canvas 库,提供了交互式的对象模型,使得在 Canvas 上创建和操作图形对象变得非常简单。Fabric.js 还支持 SVG 到 Canvas 的转换,以及 Canvas 到 SVG 的转换。通过 Fabric.js,你可以轻松创建和操作简单的几何图形、复杂的图形路径,甚...

gitblog_00780的博客 1081

2026年海能达嵌入式岗位面试题集(含参考答案)

本文总结了嵌入式系统开发中的常见面试题,涵盖项目经验、外设接口、存储系统、编程基础、操作系统等核心模块。主要内容包括:1)项目核心经历的硬件/软件架构及问题解决思路;2)SPI、I2C等接口协议的时序特点与应用要点;3)NAND Flash存储管理中的ECC校验原理和文件系统对接方案;4)USB设备枚举流程等关键知识点。这些题目针对嵌入式岗位的技术考察重点,既包含底层硬件接口细节,也涉及系统级设计与优化策略,全面考察开发者的嵌入式系统能力。

Open 359

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Fabric.js 2.7.0 发布,简易 JavaScript Canvas 库

开发四年只会写业务代码,分布式高并发都不会还做程序员? Fabric.js 2.7.0 发布了,新版本更新内容如下: ...

weixin_34273046的博客 167

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【亲测免费】 Vue Fabric.js Wrapper:将 Fabric.js 集成到 Vue 中的应用

Vue Fabric.js Wrapper:将 Fabric.js 集成到 Vue 中的应用 Vue Fabric.js Wrapper 是一个开源项目,旨在将流行的图形库 Fabric.js 集成到 Vue.js 框架中。该项目主要通过 Vue.js 和 JavaScript 编写。 核心功能 该项目的核心功能是提供一个 Vue 组件包装器,使得开发者能够在 Vue 应用中轻松地使用 Fabri...

gitblog_00848的博客 756

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

了解 Fabric.js 库

Fabric.js是一个用于创建交互式的Canvas元素的JavaScript库。它提供了一种简单而强大的方式来处理Canvas元素上的图形对象,使得在Canvas上绘制、编辑和操作图形变得更加容易。基本使用Fabric.js的步骤如下:1、引入Fabric.js库:首先,在HTML文件中引入Fabric.js库文件,可以通过CDN或本地文件引入。<script src="https://...

文摘资讯 348

fabric.js源代码分析

事件系统:理解和事件的绑定、触发。对象管理:每个图形对象的属性和方法,如何管理和修改。渲染流程:如何根据对象的状态进行绘制,尤其是对于动态交互的处理。序列化与反序列化:对象如何转换为 JSON,保存和加载的机制。性能优化:如何高效处理大量对象的渲染和事件响应。通过理解Fabric.js的核心模块,如、事件系统、图形对象等,你可以深入掌握该库的工作原理,并有效地在自己的项目中使用和扩展。Fabric.js使得在 HTML5 canvas 上构建复杂的交互式应用成为可能。

wangjinjin180的博客 977

fabric.js

fabric.js介绍 fabric.js是什么 fabric.js是可以简化canvas编写的js库,提供canvas缺少的对象模型,包含动画、数据序列号和反序列化的等高级功能的js库,开源项目,在GitHub有很多人贡献。 fabric.js优缺点 优点:fabric提供超好的画布能力. 缺点:api超级烂,没有相应的demo代码,上手难度较大. fabric.js使用笔记 对象 fabric.Circle 圆 fabric.Ellipse 椭圆 fabric.Line 直线 fabric.Polygo

m0_46582836的博客 1082

Fabric.js canvas 图形库

1、github地址: https://github.com/fabricjs/fabric.js 2、简述 Fabric.js将canvas的编程变得简单。同时在canvas上添加了交互。交互包括:移动、旋转、缩放,修改透明度、颜色和z-index等。 使用Fabric.js可以创建ectangles, circles, ellipses, polygons,以及更复杂的图形。...

weixin_30666753的博客 637

超好用的canvas交互库——Fabric.js(1)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_39285322的博客 2418

Introduction to Fabric.js. Part 1.(介绍Fabric.js第一部分)

Introduction to Fabric.js: Part 1 Introduction to Fabric.js. Part 1.(介绍Fabric.js第一部分) 今天,我想向您介绍Fabric.js —一个功能强大的Javascript库,使使用HTML5 canvas的工作变得轻而易举。 Fabric提供了画布缺少的对象模型,以及SVG解析器,交互性层和一整套其他必不可少的工具。这是一个完全开放源代码的项目,已获得麻省理工学院(MIT)的许可,多年来有许多贡献。 在发现使用原生canvas AP

百念成诗 3369

fabric.js_Fabric.js简介

fabric.js 在本文中,我将向您介绍Fabric.js —一个功能强大JavaScript库,可以轻松处理HTML5 canvas元素。 Fabric为画布提供了丢失的对象模型,以及SVG解析器,交互性层和一整套其他必不可少的工具。 这是一个完全开放源代码的项目,已获得麻省理工学院(MIT)的许可,多年来有许多贡献。 在发现使用本地canvas API的痛苦之后,三年前,我开始使用Fab...

804
上一篇: babylon.js
下一篇: PS快捷键 + 小知识
蜗牛与藤曼
博客等级 码龄9年 1万+粉丝 89原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值