Html5画布操作类库Fabric.js

(Fabric.js是一个开源的Html5画布操作类库,功能强大,可惜中文资料很少,目前公司项目正好要用,就趁这个机会翻译一下,虽然英语水平不高,但基本还是能看懂的;Fabric作者貌似俄国人,写的文档里也有一些英文拼写错误。不过头条不允许放外链地址,想去看原文的,百度搜一下Fabric.js就能找到)

Introduction to Fabric.js. Part 1.

开源Html5画布操作类库Fabric.js基础入门——第一部分(上)
今天,我给大家介绍一下Fabric.js,一个超级强大的Javascript类库,通过它可以非常轻松的使用HTML5的画布(canvas)。Fabric提供了画布缺少的对象模型、SVG解析器、交互层和一整套其他必不可少的工具。它是一个在MIT协议下的开放源码项目,多年来提供了很多贡献(Github超过10000+Star,译者注)。

在经历了使用原生画布API的各种痛苦后,我大概3年前开始开发Fabric项目。那时我在为printio.ru(我的创业网站)创建一个交互式的设计器–允许用户在线设计他们自己的衣服。我们需要的这种交互那时候只存在于Flash中。现在,使用Fabric更接近实现这种可能了。

让我们仔细看一看!

为什么是fabric?

现在画布允许我们在网页上创建神奇的图形,但是它提供的是令人失望的底层API。如果我们只想在画布上画几个基本的形状,忘记它们吧;但是如果需要任何形式的交互、图片任意点的变化或者绘制更复杂的形状–情况就戏剧性的变化了。

Fabric目标就是解决这些问题。

原生画布方法只允许我们使用简单的绘图命令,盲目的修改整个画布的位图。想画个矩形?使用fillRect(left, top, width, height)。想画条线?组合使用 moveTo(left, top) 和lineTo(x, y)。就像我们拿了把刷子在画布上刷一样,刷了一层又一层颜料,基本没做什么控制。

Fabric在原生方法上,提供了一个简单但是强大的对象模型,用来替代这种底层操作。它处理画布状态和渲染,让我们直接和对象打交道。

让我们通过一个简单的实例来演示这种差别。假如我们需要在画布上画一个红色的矩形,这是我们使用原生画布API需要做的:

// reference canvas element (with id=”c”)

var canvasEl = document.getElementById(‘c’);

// get 2d context to draw on (the “bitmap” mentioned earlier)

var ctx = canvasEl.getContext(‘2d’);

// set fill color of context

ctx.fillStyle = ‘red’;

// create rectangle at a 100,100 point, with 20x20 dimensions

ctx.fillRect(100, 100, 20, 20);

现在,看看干同样的活,用Fabric怎么做:

// create a wrapper around native canvas element (with id=”c”)

var canvas = new fabric.Canvas(‘c’);

// create a rectangle object

var rect = new fabric.Rect({

left: 100,

top: 100,

fill: ‘red’,

width: 20,

height: 20

});

// “add” rectangle onto canvas

canvas.add(rect);

开源Html5画布操作类库Fabric.js基础入门——第一部分(上)
在这一点上,它们在代码量上没什么区别–这两个例子很类似。然而,你已经发现它们在操作画布方面的区别。对于原生方法,我们操作的是上下文–一个代表整个画布位图的对象;对于Fabric,我们在对象上操作–实例化它们,改变属性,把它们加入画布。你可以看到,在Fabric世界,这些对象是一等公民。

当然,渲染简单的红色矩形太无聊了,我们可以用它干点有趣的事情!或许让它旋转一下?

让我们旋转45度。首先,使用原生画布方法:

var canvasEl = document.getElementById(‘c’);

var ctx = canvasEl.getContext(‘2d’);

ctx.fillStyle = ‘red’;

ctx.translate(100, 100);

ctx.rotate(Math.PI / 180 * 45);

ctx.fillRect(-10, -10, 20, 20);

然后,使用Fabric:

var canvas = new fabric.Canvas(‘c’);

// create a rectangle with angle=45

var rect = new fabric.Rect({

left: 100,

top: 100,

fill: ‘red’,

width: 20,

height: 20,

angle: 45

});

canvas.add(rect);

开源Html5画布操作类库Fabric.js基础入门——第一部分(上)
发生了什么?

使用Fabric,我们要做的就是改变对象的角度值为45。使用原生方法,事情变得太“有料”了,记住,我们不能操作对象,而是扭转整个画布位图的方位和角度 (ctx.translate, ctx.rotate) 来满足要求;然后我们再画矩形,但是记住适当偏移位图(-10, -10),因此它可以在点(100,100)渲染。作为额外的工作,在旋转画布位图时,我们还必须把度转换为弧度(这一段翻译的很别扭,原文写的也不好理解,其实就是说把坐标原点移到100,100,并且转换一下角度,后续操作都是以转换后的远点为参照点,适当偏移是为了让矩形的中心点正好在100,100位置)。

我敢肯定,你应该明白Fabric存在的原因以及它隐藏了多少底层代码。

让我们看看另一个例子–画布状态跟踪。

假如在某个时刻,我们需要在画布上稍稍移动我们熟知的那个红色矩形的位置,如果不在对象上操作,我们应该怎么办?还是说只需要在画布位图上调用另一个fillRect就可以了?

调用另一个fillRect命令,实际上会在已经绘制了别的东西的画布上面画矩形。还记得我早前提到过,用刷子在画布上刷?为了“移动”它,我们首先需要擦除早前画的内容,然后在新的位置画矩形。

var canvasEl = document.getElementById(‘c’);

ctx.strokRect(100, 100, 20, 20);

// erase entire canvas area

ctx.clearRect(0, 0, canvasEl.width, canvasEl.height);

ctx.fillRect(20, 50, 20, 20);

如果使用Fabric如何完成它呢?

var canvas = new fabric.Canvas(‘c’);

canvas.add(rect);

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

canvas.renderAll();

开源Html5画布操作类库Fabric.js基础入门——第一部分(上)
明白一个非常重要的区别,使用Fabric,我们在修改任何内容前,不再需要擦除内容。我们仍然操作对象,简单的改变它们的属性,就可以通过重新渲染得到新的图像了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值