fabric使用

在vue项目中使用 

网上参考很多方法做了一个画板,gitee地址放这啦,需要的小伙伴自取

https://gitee.com/xc-dh/vue-fabric-canvas

以下是一些使用笔记:

安装

npm install fabric(或yarn add fabric)

main.js中引入

import fabric from 'fabric'
Vue.use(fabric);

使用

一、在页面中声明画布
<body>
  <canvas id="canvas"></canvas>
</body>
var
canvas =new fabric.Canvas('canvas');
二、绘制图形
1、规则图形

例:

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对象上:

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( )方法对三角形的位置、颜色、角度、透明度等属性进行设置。

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插入图片

<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插入图片

var canvas = new fabric.Canvas('canvas');
      fabric.Image.fromURL('./2.png', function(oImg) {
      oImg.scale(0.1);//图片缩小10倍
      canvas.add(oImg);
  });

四、交互

对画布的交互

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:鼠标抬起时

对画布上对象的操作

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(): 接受两个参数:要组合对象名称组成的数组、组合到一起的对象的共同属性。

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数据)

canvas.toJSON()
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数据转为画布图形)

canvas.loadFromJSON(JSONDATA)
canvas.loadFromJSON(getcanvasJson)

转为SVG图片

canvas.toSVG();

保存为png图片

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);
      },

 

posted @ 2023-03-15 14:41  星辰ꦿ.大海  阅读(751)  评论(0编辑  收藏  举报