1

我想存储由不同按钮应用的所有过滤器,然后依次应用到图像上。例如,如果用户单击亮度、噪声、对比度。我想存储这些过滤器,一旦用户点击应用过滤器。我想全部应用它们。我尝试了以下方法:

Caman('#canvas', img, function () {
     //this.brightness(10).render();
     var filters = ["brightness(10)", "noise(20)"];
     filters.forEach(function (item, index) {
          this.filters(item);
     });
     this.render();
});

但这给了我错误this.filters is not a function。我可以使用注释掉的行,但这只会应用预定的过滤器。我想根据用户选择应用过滤器,并且我想在用户单击应用过滤器时一次性应用它们。

这是图书馆的链接: http: //camanjs.com/examples/

谁能指导我如何实现我想要的?如果我在否决之前没有清楚地解释这个问题,请告诉我。

4

3 回答 3

0

出现该错误是因为当您在点的值this内部使用过滤器数组而不是 caman 对象时试试这个foreachthis

Caman('#canvas', img, function () {
     //this.brightness(10).render();
     var that = this;
     var filters = ["brightness(10)", "noise(20)"];
     filters.forEach(function (item, index) {
        eval('that.'+item); 
     });
     this.render();
});

在上面的代码中,制作了一个副本,this然后将其传递到循环内部,名称为that

于 2016-12-10T19:01:53.823 回答
0

this.filters不起作用,因为“this”指的是function(item, index) {...}

我会做这样的事情:

Caman('#canvas', img, function () {
     // make 'this' available in the scope through 'self' variable
     var self = this;      

     // Filters must hold the function and not a string of the function.
     // so something like:
     var filters = [
       function() { self.brightness(10); },
       function() { self.noise(20); }
     ];

     filters.forEach(function (fn) {
          fn(); // this will execute the anonymous functions in the filters array
     });

     this.render();
});
于 2016-12-10T19:05:03.660 回答
0

您可以在数组中定义对象并使用以下方法循环效果forEach()

Caman('#canvas', img, function () {
  var filters = [
    { name: "brightness", val:10 },
    { name: "noise", val:20 }
  ];
  var that = this;
  filters.forEach(function(effect) {
    that[effect.name](effect.val);
  });
  this.render();
});
于 2016-12-10T20:21:58.147 回答