2012-01-21 11 views
0

イメージがあります!私はピクセル検出を行ってからずっとずっと、ピクセルを配列に何らかの形に変換してから、ピクセルが行の最後に到達して次のピクセルに移動するときに画像の幅を見つける必要があることを覚えていますああ、たくさんの複雑なものがあります。とにかく私は今これをやり直す方法がありませんが、一番暗いピクセルのx &の "image1"というイメージのy座標を検出する必要があります。イメージ上のほとんどの黒ピクセルを検出する - objective-c iOS

答えて

2

あなたの本屋に行って、Erica Sadunの "iOS Developer's Cookbook"という本を見つけてください。 378-ishページに移動して、そこでピクセルを検出する方法があります。この配列のRGB値を見ると、forループを実行してR、G、Bの値の合計が最小(0〜255)のピクセルをソートして見つけることができます。これは黒に最も近いピクセルを与えます。 必要に応じてコードを投稿することもできます。しかし、この本は方法と説明を与える最高の情報源です。

これは変更されたものです。メソッド名は変わりません。私が変えたのは基本的にイメージピッカーから来たイメージでした。

-(UInt8 *) createBitmap{ 
if (!self.imageCaptured) { 
     NSLog(@"Error: There has not been an image captured."); 
     return nil; 
    } 
    //create bitmap for the image 
    UIImage *myImage = self.imageCaptured;//image name for test pic 
    CGContextRef context = CreateARGBBitmapContext(myImage.size); 
    if(context == NULL) return NULL; 
    CGRect rect = CGRectMake(0.0f/*start width*/, 0.0f/*start*/, myImage.size.width /*width bound*/, myImage.size.height /*height bound*/); //original 
// CGRect rect = CGRectMake(myImage.size.width/2.0 - 25.0 /*start width*/, myImage.size.height/2.0 - 25.0 /*start*/, myImage.size.width/2.0 + 24.0 /*width bound*/, myImage.size.height/2.0 + 24.0 /*height bound*/); //test rectangle 

    CGContextDrawImage(context, rect, myImage.CGImage); 
    UInt8 *data = CGBitmapContextGetData(context); 
    CGContextRelease(context);  
    return data; 
} 
CGContextRef CreateARGBBitmapContext (CGSize size){ 

    //Create new color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    if (colorSpace == NULL) { 
     fprintf(stderr, "Error allocating color space\n"); 
     return NULL; 
    } 
    //Allocate memory for bitmap data 
    void *bitmapData = malloc(size.width*size.height*4); 
    if(bitmapData == NULL){ 
     fprintf(stderr, "Error: memory not allocated\n"); 
     CGColorSpaceRelease(colorSpace); 
     return NULL; 
    } 
    //Build an 8-bit per channel context 
    CGContextRef context = CGBitmapContextCreate(bitmapData, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaPremultipliedFirst); 
    CGColorSpaceRelease(colorSpace); 
    if (context == NULL) { 
     fprintf(stderr, "Error: Context not created!"); 
     free(bitmapData); 
     return NULL; 
    } 
    return context; 

} 
NSUInteger blueOffset(NSUInteger x, NSUInteger y, NSUInteger w){ 
    return y*w*4 + (x*4+3); 
} 
NSUInteger redOffset(NSUInteger x, NSUInteger y, NSUInteger w){ 
    return y*w*4 + (x*4+1); 
} 

下、redOffsetの方法、あなたのARGB(アルファ・赤・緑・青)規模でのレッド値を取得します。あなたが見ているARGBのどのチャンネルを変更するには、redOffset関数のx変数に追加された値を0に変更してアルファを見つけて、赤を見つけるために1に、緑を見つけるために2、青を見つけるために3で保持します。これは、上記の方法で作成された配列と、インデックス値のx勘定に加えられた配列を調べるだけで機能します。基本的に、3つの色(赤、緑、青)のメソッドを使用し、各ピクセルの合計を求めます。どのピクセルが赤、緑、および青の最低値をともに持つかが最も黒い。

+0

ああ!何が幸運!私はEricaの "iPhone Developer's Cookbook"という本を持っていますが、 "iOS Developer's Cookbook"ではありません。 :(ハハ!ピクセル検出方式の名前の一部を共有していますか? –

+0

これは素晴らしいですが、MOSTの黒の値をどのように検出しますか?絶対的な黒のピクセルがない場合、黒に最も近い色ですか? –

+0

私は私のために働いた方法がはるかに異なっています...しかし、これは質問に答えています!質問は承認されました! –

関連する問題