Проблема заключается в этом куске кода:
canvas.getActiveObject().setSrc('http://fabricjs.com/assets/pug_small.jpg', function(){
canvas.renderAll();
}, canvas.getActiveObject().toObject());
Вы передаете canvas.getActiveObject().toObject()
как options
объект, который назначен вашему изображению в setSrc()
-> setElement()
-> _initConfig()
.
toObject()
сериализует ваш fabric.Image
, а массив filters
больше не содержит фактический fabric.Filter
, а скорее его сериализованную версию. Таким образом, у него нет прототипа с методом applyTo()
, поэтому ошибка filter.applyTo is not a function
, когда фабрика пытается повторно применить фильтры к вашему изображению после setSrc()
.
Вместо того, чтобы передавать весь сериализованный объект в качестве параметров, вам нужно выбрать свойства, которые вы действительно хотите передать. Поскольку я не уверен в ваших требованиях, я попытался заменить приведенный выше код следующим, и он работал для меня:
var options = canvas.getActiveObject().toObject();
delete options.filters;
options.crossOrigin = true;
canvas.getActiveObject().setSrc('http://fabricjs.com/assets/pug_small.jpg', function(){
canvas.renderAll();
}, options);
Обратите внимание на options.crossOrigin = true
- вы не сможете применять фильтры без него.