javascript - fabricjs:在 loadFromJSON 之后保留对象图像过滤器的正确索引

标签 javascript arrays fabricjs javascript-objects fabricjs2

我正在对对象应用滤镜(在 image filters demo 之后),一切正常,但在我保存并加载 Canvas 后,图像滤镜会更改索引。

目前我有四个过滤器,它们按索引应用(如演示中所示)。

0 : Grayscale

1 : Invert

2 : Remove Color

3 :- Blend Color

因此,如果我应用灰度并删除颜色,“过滤器”数组看起来像这样,索引 0 和 2 是正确的...

enter image description here

但在我加载 Canvas 后(使用 loadFromJSON),对象的“过滤器”数组看起来像这样,索引已重置...

enter image description here

有什么方法可以加载对象并保留过滤器索引?有依赖于此的代码,当我加载包含带有过滤器的对象的 Canvas 时,它会导致错误。

我尝试在创建对象时应用以下内容...

   oImg.filters = [
     false,
     false,
     false,
     false
   ];;

创建对象时它工作正常...

enter image description here

但是当它被加载时,错误的索引被删除并且它的结果相同......

enter image description here

最佳答案

我设法通过更改我应用和检索过滤器的方式(按类型而不是索引)来实现此功能。我只是检查过滤器是否存在(通过“类型”而不是索引),然后将过滤器拼接在所需的索引处。

改变了这个功能...

getFilter(index) { 
   var obj = canvas.getActiveObject();
   return obj.filters[index];
}

对于这个...

getFilter(type) { 
  var obj = canvas.getActiveObject();
  if (obj) {
    filter = null;
    obj.filters.forEach(function(f) {
      if (f.type == type) {
        filter = f;
      }
    });
    return filter;
  }
}

改变了这个功能...

applyFilter(index, filter) {
  var object = canvas.getActiveObject();
  object.filters[index] = filter;
  object.applyFilters();
  canvas.renderAll();
}

对于这个...

applyFilter(type, filterIndex, filter) {
  var obj = canvas.getActiveObject();
  var indexExists = false;
  var filterFound = false;

  if (obj) {
    obj.filters.forEach(function(f, i) {
      if (f.type == type) {
        filterFound = true;
        obj.filters[i] = filter;
      } 
      if (filterIndex == i) {
        indexExists = true;
      } 
    });

    if (!filterFound && indexExists) {
      obj.filters.splice(filterIndex, 0, filter);
    } else if (!filterFound && !indexExists) {
      obj.filters[filterIndex] = filter;
    }

  }
  obj.applyFilters();
  canvas.renderAll();
}

改变了这个功能...

applyFilterValue(index, prop, value) {
  var obj = canvas.getActiveObject();
  if (obj.filters[index]) {
    obj.filters[index][prop] = value;
    obj.applyFilters();
    canvas.renderAll();
  }
}

对于这个...

applyFilterValue(type, filterIndex, prop, value) {
  var obj = canvas.getActiveObject();
  if (obj) {
    obj.filters.forEach(function(f, i) {
      if (f.type == type) {
        obj.filters[i][prop] = value;
      }
    });
  }
  obj.applyFilters();
  canvas.renderAll();
}

关于javascript - fabricjs:在 loadFromJSON 之后保留对象图像过滤器的正确索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49313621/

相关文章:

arrays - 如何调用 Swift Array.indexOf?

fabricjs - setText() 在 fabricjs 版本 2 中不起作用

javascript - 在fabricjs中查找旋转对象的 Angular 坐标

javascript - 单击 div 内的 iframe 中的元素后删除该 div

javascript - 使用多个数组过滤嵌套的 JSON 对象并将过滤后的对象存储在数组中

javascript - 如何对表示整数的字符串数组求和

javascript - 如何在 Fabric 中制作线条画动画

javascript - Sailsjs 更改本地化

javascript - 为什么这个 javascript 的权限被拒绝?

c++ - 读取未正确存储在数组中的字节