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

我正在对对象应用过滤器(在 image filters demo之后)并且一切正常但在我保存并加载画布后,图像过滤器会更改索引.

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

0 : Grayscale

1 : Invert

2 : Remove Color

3 :- Blend Color

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

但是在我加载画布(使用loadFromJSON)之后,对象的’filters’数组看起来像这样,索引重置…

有什么办法可以加载对象并保留过滤器索引吗?有一些代码依赖于此,当我加载具有带过滤器的对象的画布时,它会导致错误.

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

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

创建对象时它可以正常工作……

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

解决方法

我设法通过改变我应用和检索过滤器的方式(按类型而不是索引)来实现这一点.我只是检查过滤器是否存在(通过’type’而不是index),然后将过滤器拼接在所需的索引处.

改变了这个功能……

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,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,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();
}

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...