【fabricjs】 完成橡皮擦

需求:擦除图片上的某些区域;
原理:利用fabric中的自由绘画,绘画完成后,传给后端base64格式的图片

在fabric.js库中,可以自定义铅笔(free drawing)的颜色和粗细。创建画布后,可以使用以下方法设置铅笔颜色(stroke)和粗细(strokeWidth):

// 初始对画布的交互
const init = () => {
  canvas = new fabric.Canvas(canvasRef.value, {
    preserveObjectStacking: true
  });
  // 禁用选择区域 隐藏那个用于选择的蓝色矩形框,并且会禁止在画布上的多选操作。注意,这并不会禁止单个对象的选取,单个对象依然可以被选取并操作
  canvas.selection = false;

// 给自由绘画的路径添加自定义字段
  canvas.on('path:created', (e: any) => {
    e.path.set({ type: DrawType.Path });
  });

  // 设置自由绘画的样式
  if (canvas.freeDrawingBrush) {
    canvas.freeDrawingBrush.color = '#fff'; // 设置绘画颜色
    canvas.freeDrawingBrush.width = 10; // 设置绘画线条宽度
  }
};

开始绘画 需要设置isDrawingMode为true

canvas.isDrawingMode = true; // 开始绘画模式

Fabric.js 提供了几种将画布对象转化为可传输数据的方式。最常见的是把画布转化为JSON对象,然后发送到后端。

// 你可以使用下列代码在路径创建后把画布转化为JSON对象
var jsonData = canvas.toJSON();

但是我这里用的是转成base64格式的图片,发送给后端


// 获取自由绘画的base64
const getBase64Url = () => {
  const tempCanvas = new fabric.Canvas(canvasRef.value, {
    isDrawingMode: true
  });
  // 否则放大浏览器比例有问题
  tempCanvas?.setWidth(canvas.width);
  tempCanvas?.setHeight(canvas.height);

  canvas.getObjects().forEach((item: any) => {
    const oClone = fabric.util.object.clone(item);
    tempCanvas.add(oClone);
  });

  const dataURL = tempCanvas.toDataURL();
  tempCanvas.dispose();
  return dataURL;
};




  // 在外层组件中
  const url = leftPhotoContentRef.value?.getBase64Url();
  await Pepper.post(`/api/map/map_info_eraser/${pathId}`, {
    base_64_str: url
  });

补充:Fabric.js在自由绘画模式下,会使用SVG的另一种命令,那就是二次贝塞尔曲线(Quadratic Bezier Curve),表示为"Q"。这是因为相比直线,这种类型的曲线可以更好地表示手写或绘制的路径。

我打印他的path对象输出的是:
[‘M’, 91.50894473515102, 360.046875] : “M” 代表 “Move to”(移动到),移动到坐标 (91.50894473515102, 360.046875),不画线,只移动起始点。
[‘Q’, 91.51394473515101, 360.046875, 92.01393555494354, 360.046875]: “Q"代表"Quadratic Bezier Curve”(二次贝塞尔曲线)。参数是:控制点 (91.51394473515101, 360.046875) ,结束点 (92.01393555494354, 360.046875)。
[‘Q’, 92.51392637473607, 360.046875, 93.51390801432112, 360.046875] :同上,另一个二次贝塞尔曲线命令。控制点和结束点的坐标如数组指示。
[‘L’, 94.51888965390617, 360.046875] : "L"代表 “Line to”(线到),画一条线到坐标 (94.51888965390617, 360.046875)。
二次贝塞尔曲线的特点是,它有一个控制点决定了曲线的大致方向和弯曲程度,使得手绘的路径看起来更加自然且连续。

官方demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值