1

我想做的事:

我想实现用户在图像上使用 CIFilters 的能力。所以我需要以某种方式修复它的顺序。例如,如果用户打开图像,然后应用CIGaussianBlurCIColorControls然后CISepia,我需要得到这样的结果:

On user opened image apply CIGaussianBlur -> on CIGaussianBlur output image apply CIColorControls - > on CIColorControls output image apply CISepia.

没关系。但是如果用户关闭 CIGaussianBlur 怎么办?然后我需要重复这个效果的序列,而不会模糊。它看起来像这样:

On user opened image apply CIColorControls -> on CIColorControls output image apply CISepia.

问题

是否有可能做这样的事情:

应用任何效果后,在 NSMutableArray 或 NSMutableDictionary 中添加一些字符串。然后在应用其他效果时,检查 NSMutableArray 或 NSMutableDictionary 内容,如下所示:

如果索引 0 处的对象等于“模糊”,则在源图像上应用模糊,然后像当前效果的输入图像一样获取模糊的输出图像

等等?因此,每次都会按照用户制作的顺序重新应用效果。

如果可能的话,也许有人可以建议我任何解决方案?

4

1 回答 1

1

我认为这是使用工厂理念的一个很好的例子。

您应该存储过滤器数组以将图像作为数组处理 - 保持排序顺序,并且处理起来相当简单(除了 a 之类的东西NSCountedSet)。

那么,下一个要问的合乎逻辑的问题是,我们如何在这里应用工厂模式?要考虑的最重要的事情是上下文对象应该是什么类型?这里有一些想法:

  1. 用作NSString常量标识符。
    • 可能是最简单的开始,if-elseswitchNSString.

  2. NSNumber,包装一个枚举值。

    • 这可能是更好的选择之一。你可以直接转换成一个int变量,它在我能想象到的几乎任何处理器上都相当快,而且,如果你使用 ObjC 2.5 的花哨文字,你可以这样做:

      [filters addObject:@(filterType_gaussianBlur)];
      

      filterType_gaussianBlur枚举常量或其他东西在哪里。

      使用 an 的另一个优点enum是支持switch开箱即用的语句。如果处理得当,它会清理你的代码,它比大块更快if-else,唯一需要注意的是确保你break正确!

  3. 存储Class对象

    • 这可能需要一些解释。在objective-c中,您实际上可以存储对对象类型的引用CIGaussianBlurNSString, NSData, 等。

      此类“对象”允许您仅根据对象的类型动态创建对象,例如:

      Class cls = nil;
      
      if (stringMutable)
          cls = [NSMutableString class];
      else
          cls = [NSString class];
      
      NSString *mutableOrNot = [[cls alloc] initWithString:@"Hello World!"];
      

      但是,这种方法的缺点是无法在初始化后配置对象,并且您必须使用相同的选择器(方法)来初始化每个对象。如果这不是问题(我不使用 CoreImage),那么使用该Class方法应该没问题。

总而言之,在这种情况下使用任何有意义的东西。如果这些过滤器在初始化后不需要额外的配置,那么方法3很有意义。我个人不会推荐方法1,除非确实需要使用字符串。 只要有可能,请始终尝试控制对象可以具有的值。它让你的生活更轻松,相信我。

于 2012-11-05T13:51:39.387 回答