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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,pdf.js是一个用于在Web上展示PDF文档的JavaScript库。它提供了许多功能,包括搜索、缩放、注释和下载等。但是,pdf.js本身并没有提供橡皮擦功能,因此需要自己编写代码来实现。 下面是一个简单的实现橡皮擦功能的示例代码: ```javascript // 获取canvas元素 var canvas = document.getElementById('pdf-canvas'); // 获取渲染上下文 var context = canvas.getContext('2d'); // 设置橡皮擦大小 var eraserSize = 10; // 设置橡皮擦颜色 var eraserColor = '#ffffff'; // 设置橡皮擦模式 var eraserMode = false; // 监听鼠标按下事件 canvas.addEventListener('mousedown', function(e) { // 如果处于橡皮擦模式 if (eraserMode) { // 获取鼠标位置 var x = e.pageX - canvas.offsetLeft; var y = e.pageY - canvas.offsetTop; // 开始擦除 context.beginPath(); context.arc(x, y, eraserSize, 0, Math.PI * 2); context.fillStyle = eraserColor; context.fill(); } }); // 监听鼠标移动事件 canvas.addEventListener('mousemove', function(e) { // 如果处于橡皮擦模式 if (eraserMode) { // 获取鼠标位置 var x = e.pageX - canvas.offsetLeft; var y = e.pageY - canvas.offsetTop; // 擦除 context.beginPath(); context.arc(x, y, eraserSize, 0, Math.PI * 2); context.fillStyle = eraserColor; context.fill(); } }); // 监听鼠标松开事件 canvas.addEventListener('mouseup', function(e) { // 如果处于橡皮擦模式 if (eraserMode) { // 停止擦除 context.closePath(); } }); // 切换橡皮擦模式 function toggleEraserMode() { eraserMode = !eraserMode; } ``` 这段代码监听了canvas元素的鼠标事件,并根据鼠标位置在canvas上绘制圆形来实现橡皮擦功能。可以通过调整eraserSize和eraserColor来改变橡皮擦的大小和颜色。toggleEraserMode函数用于切换橡皮擦模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值