什么是Fabric.js?
Fabric.js是一个可以简化Canvas程序编写的库。 Fabric.js为Canvas提供所缺少的对象模型, svg parser, 交互和一整套其他不可或缺的工具。
为什么要使用Fabric.js?
Canvas提供一个好的画布能力, 但是Api不够友好。绘制简单图形其实还可以, 不过做一些复杂的图形绘制, 编写一些复杂的效果,就不是那么方便了。Fabric.js就是为此而开发,它主要就是用对象的方式去编写代码。
起步
Vue项目中引入Fabric.js
假设您的项目中正在使用ES6和Webpack,您可以开始使用Fabric.js,如下所示:
1、在命令行中:
npm install fabric(或yarn add fabric)
2、将其引入 .vue 文件中
import { fabric } from 'fabric'
3、在 .vue 的单文件中的 mounted: 生命周期里开始你的Fabric.js之旅啦
注:默认的fabric npm模块产生了相当大的包,如果Fabric.js中您有很多可能不需要的包,在这种情况下,可以在 在此处 或在命令行中构建你自己的版本。
绘制图片
1、在组件上添加一个带有id的canvas
<canvas id="c"></canvas>
2、初始化画布
this.canvasObj = new fabric.Canvas('c',{
preserveObjectStacking:true // 禁止选中图层时自定置于顶部
});
this.canvasObj.setWidth(this.caWidth); //设置画布宽度
this.canvasObj.setHeight(this.caHeight); //设置画布高度
3、添加图形至画布
setImage: function (imgname) {
let imgCoord = fabric.Image.fromURL(imgname, (img) => {
img.scale(1).set({
left: 150,
top: 150,
angle: -15
});
this.canvasObj.add(img).setActiveObject(img);
});
}
至此图形已经添加到画布里面去啦,接下来是要获取图形的XY坐标
通过fabric.js提供的getObjects()方法即可获取到图形对象的所有信息,fabric.js会以数组的形式按照图片先后层次将图片返回出来,在此我只需拿到图片的上右下左四个角的坐标
getImg: function () {
this.imgcoordinate = [];
let items = this.canvasObj.getObjects();
items.forEach((item, index) => {
let itemcoord = {
floorIndex: index,
tl: {
x: item.aCoords.tl.x,
y: item.aCoords.tl.y
},
tr: {
x: item.aCoords.tr.x,
y: item.aCoords.tr.y
},
bl: {
x: item.aCoords.bl.x,
y: item.aCoords.bl.y
},
br: {
x: item.aCoords.br.x,
y: item.aCoords.br.y
}
};
this.imgcoordinate.push(itemcoord);
});
}
至此就可以将图片的坐标信息全部获取到,如果需要改变图片的层次以及删除图片还可以往下看
// 移动层次
moveActive: function (index) {
let t = this.canvasObj.getActiveObject();
switch (index) {
case 0:
t.sendBackwards(); //向下一层
break;
case 1:
t.sendToBack(); //向下至底层
break;
case 2:
t.bringForward(); //向上一层
break;
case 3:
t.bringToFront(); //向上至顶层
break;
case 4:
this.canvasObj.remove(t); //删除图片
break;
default:
return
}
},
如果想要将生成图片并下载,可以将生成的图片信息绑定到一个<a>标签,再模拟点击下载
domeLode: function(){
let url = this.canvasObj.toDataURL();
$('<a>').attr({href:url,download:'a.png'})[0].click();
}
看下最终效果图