You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fabric.js中如何实现带阴影的透明对象?求模糊多边形方案

实现Fabric.js模糊多边形的可行方案

针对你遇到的Fabric.js无法直接给多边形对象加滤镜、阴影受原对象透明度影响的问题,这里有几个实用的解决思路:

方案1:克隆对象作为独立模糊层

创建两个多边形实例:一个作为底层模糊效果载体,一个保留原对象的交互(如果需要)。模糊层无需设置透明度,直接应用模糊效果,完全不受原对象影响。

// 创建原多边形(需保留交互则设为可见,仅需模糊效果可隐藏)
const originalPoly = new fabric.Polygon([
  { x: 100, y: 100 },
  { x: 200, y: 100 },
  { x: 150, y: 200 }
], {
  fill: 'transparent',
  stroke: 'transparent'
});

// 克隆多边形作为模糊层
const blurPoly = originalPoly.clone();
blurPoly.set({
  fill: 'red',
  stroke: 'red',
  filters: [new fabric.Image.filters.Blur({ blur: 10 })],
  selectable: false // 禁止选中,避免干扰原对象交互
});

// 模糊层放在底层,原对象叠加在上方
canvas.add(blurPoly);
canvas.add(originalPoly);

方案2:将多边形转为图片对象后加滤镜

利用Fabric.js的toDataURL方法把多边形转换成图片,再给图片应用模糊滤镜,复用Fabric对图片的滤镜支持:

const poly = new fabric.Polygon([
  { x: 100, y: 100 },
  { x: 200, y: 100 },
  { x: 150, y: 200 }
], {
  fill: 'red',
  stroke: 'red'
});

// 将多边形渲染为图片后添加模糊滤镜
poly.toDataURL({
  format: 'png',
  callback: function(dataURL) {
    fabric.Image.fromURL(dataURL, function(img) {
      img.set({
        filters: [new fabric.Image.filters.Blur({ blur: 10 })],
        left: poly.left,
        top: poly.top
      });
      img.applyFilters();
      canvas.add(img);
      canvas.remove(poly); // 移除原多边形(无需保留时执行)
    });
  }
});

方案3:自定义渲染逻辑(进阶)

直接重写多边形的渲染方法,使用Canvas原生filter属性实现模糊,无需额外对象:

const poly = new fabric.Polygon([
  { x: 100, y: 100 },
  { x: 200, y: 100 },
  { x: 150, y: 200 }
], {
  fill: 'red',
  stroke: 'red',
  // 重写渲染方法,添加模糊效果
  _render: function(ctx) {
    ctx.save();
    ctx.filter = 'blur(10px)';
    this._renderFill(ctx);
    this._renderStroke(ctx);
    ctx.restore();
  }
});

canvas.add(poly);

内容的提问来源于stack exchange,提问作者Nikolay Dyankov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:50:13