调用画布函数`loadFromJson`时混合过滤器不适用
Posted
技术标签:
【中文标题】调用画布函数`loadFromJson`时混合过滤器不适用【英文标题】:Blend Filter Not apply when call canvas function `loadFromJson` 【发布时间】:2019-05-11 00:46:16 【问题描述】:当我对图像执行blend
过滤并将画布转换为 JSON 时
然后我再次从那个 JSON 加载画布,当时我的过滤器没有应用。
我使用的是 Fabric 版本 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 后,所有其他过滤器都可以正常工作,但只有混合过滤器不起作用。 我的过滤器中是否缺少任何属性?
我创建了一个代表问题的小提琴: http://jsfiddle.net/Mark_1998/1pc95xef/3/
【问题讨论】:
【参考方案1】:这似乎是由Blend.toObject()
未保存其类类型引起的错误,因此Blend
过滤器在序列化时最终没有type: 'Blend'
。为了正确反序列化对象,Fabric 会解析它的type
属性,当它没有找到序列化过滤器的属性时,它就会放弃它。
您可以使用以下补丁来解决此问题:
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()
确实设置了type
属性,因此从它返回的对象扩展Blend.prototype.toObject()
是有意义的。
P.S:最新的 fabric.js 2.4+ 没有这个问题,所以这是升级的另一个理由。
【讨论】:
@mayurkukadiya 当然,这是你的补丁的一个分支:jsfiddle.net/kcn2Lv9e。只需确保在 序列化过滤器之前调用它。以上是关于调用画布函数`loadFromJson`时混合过滤器不适用的主要内容,如果未能解决你的问题,请参考以下文章
Fabricjs loadFromJSON Line 的子类
如何从 JSON 重新加载自定义 fabricJS 画布对象?
Fabric.js - 如何使用自定义属性在服务器上保存画布