2012-01-31 13 views
2

iPad用のカラーブックアプリケーション(iOS4 +)を開発中です。アプリケーションは、一度に1つの画像の1つの領域のみを色付けすることができます。iOSの画像の一部からマスクを作成する

つまり、ユーザーが画面のどこに触れて指を動かすと、最初のタッチポイントと同じ領域に含まれるピクセルだけに色を適用する必要があります。たとえば、ユーザーが左の画像の中央に触れて、画像全体に指を動かすと、右の画像のようなものが得られるはずです。

enter image description here

私は仕事のための解決策の一つが触れた領域の形状にマスクを作成し、遠くの変更を行う前に、画像には、このマスクを適用するかもしれないと思います。しかし、正直なところ、私はどこから始めるべきか分かりません。

どうすればこのようなマスクを作成できますか教えてください。

解決策は、Core GraphicsとOpen GLを使用することがあります。

+0

[flood fillアルゴリズム](http://ja.wikipedia.org/wiki/Flood_fill)のタスクのように聞こえます。 – Till

+0

@これで詳細を教えていただけますか? – Bobrovsky

+0

@Borbrovskyは境界を見つけて結果からマスクを作成するためにフラッドフィルを使用します。 – Till

答えて

2

@が示唆したように、私はキューに入れられたフラッドフィルアルゴリズムを実装しました。私はsome optimizationsを実行して、メモリ消費量と実行速度を合理的な限度に保つ必要がありました。

実際に画像を入力するアルゴリズムは使用しません。私はマスクを作成するためのアルゴリズムを使用します。

  • は、マスクバイトの配列(IMAGE_WIDTH * IMAGE_HEIGHTバイト)を作成します
  • は0xFFと、アレイ全体が内の全ての画素を見つけるため
  • 使用フラッドフィルアルゴリズム値塗りつぶしエリアとそのエリアを含む矩形の座標。
  • マスクバイト配列の対応する値を0に設定する
  • マスクバイトの別の(より小さい配列)を作成し、マスクバイトの配列の一部を新しい配列にコピーします。
  • 以下のコードあなたがいずれかのマスクを作成することができ、次の
このコードを使用して
 
    CGContextSaveGState(context); 

    CGContextTranslateCTM(context, 0.0, 768); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGRect r = CGRectApplyAffineTransform(maskImageRect, CGContextGetCTM(context)); 
    CGContextClipToMask(context, r, maskImage); 

    CGContextTranslateCTM(context, 0.0, 768); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // mask is setup, draw here 

    CGContextRestoreGState(context); 

のようなコードを使用して、後にマスクを使用することができます

 
    NSData* maskData = // construct NSData from mask bytes 

    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFMutableDataRef)maskData); 

    int width = maskRight - maskLeft + 1; 
    int height = maskBottom - maskTop + 1; 
    CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, dataProvider, NULL, YES); 
    CGDataProviderRelease(dataProvider); 
  • を使用してマスクを作成します。形状。必要に応じて、半透明マスクを作成することもできます。半透明マスクを作成するには、透明領域(0 - 完全透明、255 - 完全に不透明)のマスクバイトの配列に0以外の値を設定する必要があります。

関連する問題