Можно ли анимировать фильтр в Fabric.js?

Можно ли анимировать фильтр изображений в Fabric.js? Например, «пиксельный» фильтр.


person Faradey    schedule 03.03.2013    source источник
comment
Как именно вы хотите анимировать фильтр? Какой параметр должен изменяться в течение определенного периода времени?   -  person kangax    schedule 05.03.2013
comment
Например, фильтр яркости для медленного изменения яркости.   -  person Faradey    schedule 05.03.2013
comment
и где можно задать вопросы на русском языке   -  person Faradey    schedule 05.03.2013
comment
Если вы перетащите ползунок яркости в этой демонстрации — fabricjs.com/image-filters — я думаю, что это эффект, который вы хотите. Это свойство вам нужно анимировать (например, через fabric.util.animate fabricjs.com /docs/symbols/fabric.util.html#.animate)   -  person kangax    schedule 05.03.2013


Ответы (2)


Я решил это так же, как демо. К сожалению, фильтры нельзя анимировать — для этого требуется слишком много времени на обработку.

Вот мой код:

image = ... //Image, where the filter should be applied

var filter = new fabric.Image.filters.RemoveWhite({
    threshold: 0,
    distance:  140
});
image.filters.push(filter);
image.applyFilters(canvas.renderAll.bind(canvas));

animate(image,1, 400);   //Start the Animation

function animate(image,value, stop){
    value += ((stop-value)*0.02);    //Change the threshold-value

    if (image.filters[0]) {   
        image.filters[0]['threshold'] = value;
        console.log(value);
        image.applyFilters(canvas.renderAll.bind(canvas));  //Start creating the new image

        if(value<stop-100){
            setTimeout(function(){act(image,value,stop);},1);  
        }
    }
}

Я знаю, что код не самый эффективный, но он работает. И вы можете видеть, что анимация фильтров занимает слишком много времени.

(Я протестировал его с изображением 1920x1080px, возможно, вы сможете использовать его с изображениями меньшего размера)

person maja    schedule 18.11.2013
comment
Использование fabric.util.requestAnimFrame, вероятно, было бы более эффективным (вместо ручного рекурсивного setTimeout) - person kangax; 18.11.2013

Вот обновленная версия фильтра яркости

  var brightnessValue = 0.9;
  var brightnessFilter = new fabric.Image.filters.Brightness({
    brightness: brightnessValue
  });
  fabricImage.filters.push(brightnessFilter);

  fabric.util.requestAnimFrame(function brightnessFilterAnimation() {
    brightnessValue = brightnessValue - 0.04;
    brightnessFilter.brightness = brightnessValue;
    fabricImage.applyFilters();
    if (brightnessValue > 0) {
      fabric.util.requestAnimFrame(brightnessFilterAnimation);
    }
  });
person antpaw    schedule 12.10.2017