2012-01-21 2 views
0

이미지가 있습니다! 픽셀 감지를 한 지 오래 됐었습니다. 어쨌든 픽셀을 배열로 변환 한 다음 픽셀이 행 끝에 도달하여 다음 픽셀로 이동하는 것을 확인하기 위해 이미지의 너비를 찾아야한다는 것을 기억합니다. 그리고 아아, 많은 복잡한 재료 haha! 어쨌든 이제 더 이상이 작업을 수행 할 방법이 없지만 왼쪽 가장 어두운 픽셀의 xy 이미지를 "image1"좌표로 감지해야합니다. 적절한 시작 위치는 무엇입니까?이미지에서 가장 검은 색 픽셀 감지 - objective-c iOS

답변

2

서점으로 이동하여 Erica Sadun의 "iOS Developer 's Cookbook"이라는 책을 찾으십시오. 378 페이지로 이동하십시오. 거기에는 픽셀 감지 방법이 있습니다. 이 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 계정에 추가하기 때문에이 방법이 효과적입니다. 기본적으로 세 가지 색상 (빨강, 녹색 및 파랑)에 대한 방법을 사용하고 각 픽셀에 대한 합계를 찾습니다. 적색, 녹색, 청색 중 가장 낮은 값을 갖는 픽셀이 가장 검정색입니다.

+0

아! 행운! Erica가 책 "iPhone Developer 's Cookbook"을 가지고 있지만 "iOS Developer 's Cookbook"이 아닙니다. Ahhh! :(하하! 픽셀 감지 방식의 일부 이름을 공유하는 마음이 있습니까?) –

+0

대단합니다!하지만 가장 검정색 값을 어떻게 감지합니까? 절대적인 검정색 픽셀이 없으면 어떻게하면 다음을 감지 할 수 있습니까? 가장 가까운 색을 검정색으로합니다 ... –

+0

저에게 맞는 다른 방법을 찾았습니다 ...하지만이 질문에 답하는 것은 아닙니다! –

관련 문제