@が示唆したように、私はキューに入れられたフラッドフィルアルゴリズムを実装しました。私は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以外の値を設定する必要があります。
[flood fillアルゴリズム](http://ja.wikipedia.org/wiki/Flood_fill)のタスクのように聞こえます。 – Till
@これで詳細を教えていただけますか? – Bobrovsky
@Borbrovskyは境界を見つけて結果からマスクを作成するためにフラッドフィルを使用します。 – Till