当前位置: 首页 > article >正文

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


http://www.kler.cn/a/287087.html

相关文章:

  • 艾瑞白皮书解读(四)丨深度解析企业数据治理第一步:咨询环节
  • 【解决】CentOS7 生命周期结束后 使用 yum命令报错问题
  • assert()在solidity的运用,模糊测试案例
  • 【C++】vector(下)--下篇
  • prometheus基于文件的服务发现
  • 百日草花语探秘:天长地久的情感寄托与丰富内涵解析
  • 基于Virtex UltraScale+ VU13P FPGA的4路FMC接口基带信号处理平台
  • Python测试之测试覆盖率统计
  • Linux:SQLite 数据库
  • 安卓13 鼠标右键作返回键,鼠标事件修改
  • Vidda电视X Ultra等加入能效补贴,京东天猫可买量大管饱
  • 【验证码逆向专栏】某某滑块逆向分析
  • Java常见设计模式
  • 第二证券:三大因素将共同推动悲观情绪修复 风格阶段性趋于平衡
  • 【算法】二分查找
  • ARM32开发——(二十一)ADC系统工作原理
  • MobaXterm 终端工具使用
  • 【JVM】执行引擎、JIT、逃逸分析(二)
  • SQLite3 数据库
  • 【Python机器学习】NLP分词——词的“情感”