Filter 调用画布函数'loadFromJson'时不应用混合筛选器`

Filter 调用画布函数'loadFromJson'时不应用混合筛选器`,filter,fabricjs,blending,Filter,Fabricjs,Blending,当我对图像执行blend过滤并将画布转换为JSON时 然后我再次从JSON加载画布,当时我的过滤器没有应用 我使用的是结构版本1.7.22 我的筛选代码如下所示: canvas.getActiveObject().filters.push(new fabric.Image.filters.BlendColor({ color: '#ff0000', mode: 'add', a

当我对图像执行
blend
过滤并将画布转换为JSON时

然后我再次从JSON加载画布,当时我的过滤器没有应用

我使用的是结构版本1.7.22

我的筛选代码如下所示:

canvas.getActiveObject().filters.push(new fabric.Image.filters.BlendColor({
                    color: '#ff0000',
                    mode: 'add',
                    alpha: 0.8
                }))
canvas.getActiveObject().applyFilters(canvas.renderAll.bind(canvas));
在画布加载到JSON后,所有其他过滤器都能正常工作,但只有混合过滤器不能工作。 我的筛选器中是否缺少任何属性

我制作了一把小提琴来代表这个问题:
这似乎是由于
Blend.toObject()
未保存其类类型而导致的错误,因此
Blend
过滤器在序列化时没有
type:'Blend'
。为了正确地反序列化对象,Fabric解析其
类型
属性,当它没有为序列化过滤器找到一个属性时,它只是放弃它

以下是一个修补程序,可用于修复此问题:

fabric.Image.filters.Blend.prototype.toObject = function() {
  return fabric.util.object.extend(this.callSuper('toObject'), {
    color: this.color,
    image: this.image,
    mode: this.mode,
    alpha: this.alpha
  });
}
BaseFilter.prototype.toObject()
确实设置了
类型
属性,因此从它返回的对象扩展
Blend.prototype.toObject()
是有意义的


注:最新的fabric.js 2.4+没有这个问题,因此这是升级的另一个原因。

@mayurkukakadiya当然,这里有一个补丁供您使用:。只需确保在序列化过滤器之前调用它。