fabric使用
在vue项目中使用
网上参考很多方法做了一个画板,gitee地址放这啦,需要的小伙伴自取
https://gitee.com/xc-dh/vue-fabric-canvas
以下是一些使用笔记:
安装
代码语言:javascript复制npm install fabric(或yarn add fabric)
main.js中引入
代码语言:javascript复制import fabric from 'fabric'
Vue.use(fabric);
使用
一、在页面中声明画布
代码语言:javascript复制<body>
<canvas id="canvas"></canvas>
</body>
var canvas =new fabric.Canvas('canvas');
二、绘制图形
1、规则图形
例:
代码语言:javascript复制var rect = new fabric.Rect({
left:100,//距离画布左侧的距离,单位是像素
top:100,//距离画布上边的距离
fill:'red',//填充的颜色
width:30,//方形的宽度
height:30//方形的高度
});
//添加图形至画布
canvas.add(rect);
Fabric提供了7种基本的对象类
- fabric.Circle //圆形
- fabric.Ellipse //椭圆
- fabric.Line //线
- fabric.Polygon //多边形
- fabric.Polyline //交叉线 折线
- fabric.Rect //矩形
- fabric.Triangle//三角形
这些实例都继承fabric.Object,如果你想画一些图形,并且需要一些公共方法。这时候就可以在fabric.Object上定义一个方法,来让子类继续。
比如我们定一个方法getAngleInRadians 方法在fabric.Object对象上:
代码语言:javascript复制fabric.Object.prototype.getAngleInRadians = function() {
return this.get('angle') / 180 * Math.PI;
};
var rect = new fabric.Rect({ angle: 45 });
rect.getAngleInRadians(); // 0.785...
var circle = new fabric.Circle({ angle: 30, radius: 10 });
circle.getAngleInRadians(); // 0.523...
circle instanceof fabric.Circle; // true
circle instanceof fabric.Object; // true
2、绘制不规则图形
使用路径绘图:用点和线的移动的方式进行绘图。通过对 线、曲线、弧的应用绘制非常复杂的图形。
在fabric.Path( )方法中,“M”代表“移动”命令,这个“M 00” 代表把画笔移动到(0,0)点坐标。
“L”代表“线”,“L 200 100 ”的意思是使用钢笔画一条线,从(0,0)坐标画到(200,100)坐标。 “z” 代表让图形闭合路径。
画好三角形后,我们可以用set( )方法对三角形的位置、颜色、角度、透明度等属性进行设置。
代码语言:javascript复制var path = new fabric.Path('M 0 0 L 200 100 L 170 200 z');
path.set({ left: 120, top: 120,fill:'red' });
canvas.add(path);
三、对图片的操作
HTML插入图片
代码语言:javascript复制<body>
<canvas id="canvas" width='800' height='800'></canvas>
<img src="./2.png" id="img">
</body>
<script>
var canvas = new fabric.Canvas('canvas');//声明画布
var imgElement = document.getElementById('img');//声明我们的图片
var imgInstance = new fabric.Image(imgElement,{ //设置图片位置和样式
left:100,
top:100,
width:200,
height:100,
angle:30//设置图形顺时针旋转角度
});
canvas.add(imgInstance);//加入到canvas中
</script>
JavaScript插入图片
代码语言:javascript复制var canvas = new fabric.Canvas('canvas');
fabric.Image.fromURL('./2.png', function(oImg) {
oImg.scale(0.1);//图片缩小10倍
canvas.add(oImg);
});
四、交互
对画布的交互
代码语言:javascript复制canvas.add(imgInstance);//加入到canvas中
var canvas = new fabric.Canvas('canvas');
canvas.on('mouse:down', function(options) {
console.log(options.e.clientX, options.e.clientY)
})
注:常用监听事件如下:
mouse:down
:鼠标按下时mouse:move
:鼠标移动时mouse:up
:鼠标抬起时
对画布上对象的操作
代码语言:javascript复制var canvas = new fabric.Canvas('canvas');
var rect = new fabric.Rect({ width: 100, height: 50, fill: 'green' });
rect.on('selected', function() {//选中监听事件
console.log('selected a rectangle');
});
var circle = new fabric.Circle({ radius: 75, fill: 'blue' });
circle.on('selected', function() {
console.log('selected a circle');
});
canvas.add(rect);
canvas.add(circle);
注:常用监听事件如下:
after:render
:画布重绘后object:selected
:对象被选中object:moving
:对象移动object:rotating
:对象被旋转object:added
:对象被加入object:removed
:对象被移除
五、组合
new fabric.Group(): 接受两个参数:要组合对象名称组成的数组、组合到一起的对象的共同属性。
代码语言:javascript复制var canvas = new fabric.Canvas('canvas');
var circle = new fabric.Circle({//绘制圆形
radius: 100,
fill: '#f00',
scaleY: 0.5,
originX: 'center',//调整中心点的X轴坐标
originY: 'center'//调整中心点的Y轴坐标
});
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);
六、序列化与反序列化
序列化(将画布图形转为JSON数据)
代码语言:javascript复制canvas.toJSON()
代码语言:javascript复制var canvas = new fabric.Canvas('canvas');
var rect = new fabric.Rect({
width: 100,
height: 100,
fill: 'red'
});
canvas.add(rect);
console.log(JSON.stringify(canvas.toJSON()));
反序列化(将JSON数据转为画布图形)
代码语言:javascript复制canvas.loadFromJSON(JSONDATA)
代码语言:javascript复制canvas.loadFromJSON(getcanvasJson)
转为SVG图片
代码语言:javascript复制canvas.toSVG();
保存为png图片
代码语言:javascript复制var canvas = document.getElementById('canvas')
var imgSrc = canvas.toDataURL('png');
// 保存当前画布为png图片
save() {
var canvas = document.getElementById('canvas')
var imgSrc = canvas.toDataURL('png');
imgSrc = imgSrc.replace('image/png', 'image/octet-stream');
console.log(imgSrc,'imgSrc');
// 下载后的文件名,可自由指定
var filename = 'drawingboard_' (new Date()).getTime() '.' 'png';
this.saveFile(imgSrc, filename);
},
// 保存为文件
saveFile(data, filename) {
var save_link = document.createElement('a');
save_link.href = data;
save_link.download = filename;
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
save_link.dispatchEvent(event);
},