fabricjs:在 loadFromJSON 之后保留对象图像过滤器的正确索引
fabricjs: retain the correct indexes of an object's image filters after loadFromJSON
我正在对对象应用滤镜(在 image filters demo 之后)并且一切正常,但是在我保存并加载 canvas 之后,图像滤镜更改索引。
目前我有四个过滤器,它们是按索引应用的(如演示中所示)。
0 : Grayscale
1 : Invert
2 : Remove Color
3 :- Blend Color
因此,如果我应用灰度并删除颜色,'filters' 数组看起来像这样,索引 0 和 2 是正确的...
但是在我加载 canvas(使用 loadFromJSON)之后,对象的 'filters' 数组看起来像这样,索引已重置...
有什么方法可以加载对象并保留过滤器索引?有依赖于此的代码,当我加载具有过滤器的对象的 canvas 时,它会导致错误。
我尝试在创建对象时应用以下内容...
oImg.filters = [
false,
false,
false,
false
];;
创建对象时正常...
但是当它被加载时,错误的索引被删除并且它的结果相同...
我通过更改我应用和检索过滤器的方式(按类型而不是索引)设法使它工作。我只是检查过滤器是否存在(通过 'type' 而不是索引),然后将过滤器拼接在所需的索引处。
更改了此功能...
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();
}
在我当前的项目中,我需要能够自定义过滤器的顺序。 canvas.toDatalessJSON()
之后索引丢失的问题让我想到了为此制定一个简单的解决方案。
每次加载 canvas 时,我只是构建一个新的过滤器名称数组。
const filterNamesDefault = ['Contrast', 'Saturation', 'Sharpen', 'Tint', 'invert', 'grayscale', 'Sepia'];
var filterNames = [];
var canvasLoaded = false;
canvasLoaded
是一个布尔值,在加载 canvas 时必须将其设置为 true。
然后在 applyFilterType
和 applyFilterValue
函数中,我为函数提供过滤器类型而不是索引:
function filterIndex(filterType) {
if (canvasLoaded) { return filterNames.indexOf(filterType); } else { return filterNamesDefault.indexOf(filterType); }
}
function applyFilterType(type, filter) {
var index=filterIndex(type);
...
}
function applyFilterValue(type, prop, value) {
var index=filterIndex(type);
...
}
假设我像往常一样添加了一些存储在 canvas.filters
对象中的过滤器 ['Sharpen','Tint']
,并在 canvas save/load 之后重新定位。
然后当我想显示图像层的过滤器编辑框时,我执行这个:
var obj = canvas.getActiveObject();
filterNames = [];
obj.filters.forEach(function(f,i){
filterNames.push(f.type);
});
for (var i=0;i<filterNamesDefault.length;i++){
if (!filterNames.includes(filterNamesDefault[i])) filterNames.push(filterNamesDefault[i]);
}
现在 filterNames
的新订单是:
['Sharpen', 'Tint', 'Contrast', 'Saturation', 'invert', 'grayscale', 'Sepia']
它也适用于过滤器的新顺序。
我正在对对象应用滤镜(在 image filters demo 之后)并且一切正常,但是在我保存并加载 canvas 之后,图像滤镜更改索引。
目前我有四个过滤器,它们是按索引应用的(如演示中所示)。
0 : Grayscale
1 : Invert
2 : Remove Color
3 :- Blend Color
因此,如果我应用灰度并删除颜色,'filters' 数组看起来像这样,索引 0 和 2 是正确的...
但是在我加载 canvas(使用 loadFromJSON)之后,对象的 'filters' 数组看起来像这样,索引已重置...
有什么方法可以加载对象并保留过滤器索引?有依赖于此的代码,当我加载具有过滤器的对象的 canvas 时,它会导致错误。
我尝试在创建对象时应用以下内容...
oImg.filters = [
false,
false,
false,
false
];;
创建对象时正常...
但是当它被加载时,错误的索引被删除并且它的结果相同...
我通过更改我应用和检索过滤器的方式(按类型而不是索引)设法使它工作。我只是检查过滤器是否存在(通过 'type' 而不是索引),然后将过滤器拼接在所需的索引处。
更改了此功能...
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();
}
在我当前的项目中,我需要能够自定义过滤器的顺序。 canvas.toDatalessJSON()
之后索引丢失的问题让我想到了为此制定一个简单的解决方案。
每次加载 canvas 时,我只是构建一个新的过滤器名称数组。
const filterNamesDefault = ['Contrast', 'Saturation', 'Sharpen', 'Tint', 'invert', 'grayscale', 'Sepia'];
var filterNames = [];
var canvasLoaded = false;
canvasLoaded
是一个布尔值,在加载 canvas 时必须将其设置为 true。
然后在 applyFilterType
和 applyFilterValue
函数中,我为函数提供过滤器类型而不是索引:
function filterIndex(filterType) {
if (canvasLoaded) { return filterNames.indexOf(filterType); } else { return filterNamesDefault.indexOf(filterType); }
}
function applyFilterType(type, filter) {
var index=filterIndex(type);
...
}
function applyFilterValue(type, prop, value) {
var index=filterIndex(type);
...
}
假设我像往常一样添加了一些存储在 canvas.filters
对象中的过滤器 ['Sharpen','Tint']
,并在 canvas save/load 之后重新定位。
然后当我想显示图像层的过滤器编辑框时,我执行这个:
var obj = canvas.getActiveObject();
filterNames = [];
obj.filters.forEach(function(f,i){
filterNames.push(f.type);
});
for (var i=0;i<filterNamesDefault.length;i++){
if (!filterNames.includes(filterNamesDefault[i])) filterNames.push(filterNamesDefault[i]);
}
现在 filterNames
的新订单是:
['Sharpen', 'Tint', 'Contrast', 'Saturation', 'invert', 'grayscale', 'Sepia']
它也适用于过滤器的新顺序。