1

私がしたいこと:

ユーザーがイメージで CIFilters を使用できるようにする機能を実装したいと考えています。だから私はどういうわけかそのシーケンスを修正する必要があります。たとえば、ユーザーが画像を開いてから適用し、次に適用するCIGaussianBlurと、次CIColorControlsCISepiaような結果を得る必要があります。

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

これは、工場のアイデアを使用するための良い例だと思います。

画像を配列として処理するには、フィルターの配列を保存する必要があります。これは、並べ替え順序を維持し、処理がかなり簡単です (のようなものを除くNSCountedSet)。

次の論理的な質問は、ファクトリ パターンをここでどのように適用するかということです。考慮すべき最も重要なことは、コンテキスト オブジェクトをどの型にするかです。ここにいくつかの考えがあります:

  1. NSString定数識別子として使用します。
    • おそらく最も簡単に開始でき、理解しやすい - 欠点は、他のオプションよりも遅く、. でステートメントをif-else使用できないため、非常に複雑なブロックになる可能性があることです。 switchNSString

  2. NSNumber、列挙値をラップします。

    • これはおそらくより良いオプションの 1 つです。変数に変換できintます。これは、私が想像できるほぼすべてのプロセッサで非常に高速に比較できます。また、ObjC 2.5 の派手なリテラルを使用すると、次のようなことができます。

      [filters addObject:@(filterType_gaussianBlur)];
      

      filterType_gaussianBlur列挙定数か何かはどこにありますか。

      を使用するもう 1 つの利点は、すぐに使用できるステートメントenumのサポートです。switch適切に行えばコードがクリーンアップされます。大きなif-elseブロックよりも高速です。注意すべき唯一のことは、break適切に行うことです。

  3. Classオブジェクトの保存

    • これには説明が必要かもしれません。Objective-CではCIGaussianBlur、オブジェクトの型への参照を実際に格納できます。NSStringNSData

      このクラス「オブジェクト」を使用すると、タイプに基づいてオブジェクトを動的に作成できます。次に例を示します。

      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 に答える