2013-10-30 3 views
2

내 작업은 UIImage 객체에서 모든 이미지 픽셀을 가져 와서 변수에 저장하는 것입니다. 나 컬러 이미지를 그렇게하는 것은 어려운 일이 아니다 :UIImage 객체에서 모든 이미지 픽셀을 얻는 방법

CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); 

    size_t ele = CGColorSpaceGetNumberOfComponents(colorSpace); 

    CGFloat cols = image.size.width; 
    CGFloat rows = image.size.height; 

    // Create memory for the input image 
    unsigned char *img_mem; 
    img_mem = (unsigned char*) malloc(rows*cols*4); 
    unsigned char *my_img; 
    my_img = (unsigned char *)malloc(rows*cols*3); 


    CGContextRef contextRef = CGBitmapContextCreate(img_mem,                 cols,      // Width of bitmap 
                rows,      // Height of bitmap 
                8,       // Bits per component 
                cols*4,    // Bytes per row 
                colorSpace,     // Colorspace 
                kCGImageAlphaNoneSkipLast|kCGBitmapByteOrderDefault); // Bitmap info flags 

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); 

    CGContextRelease(contextRef); 
    CGColorSpaceRelease(colorSpace); 

    unsigned int pos_new; 
    unsigned int pos_old; 
    for(int i=0; i<rows; i++) 
    { 
     pos_new = i*cols*3; 
     pos_old = i*cols*4; 

     for(int j=0; j<cols; j++) 
     { 
      my_img[j*3+pos_new] = img_mem[pos_old+j*4]; 
      my_img[j*3+pos_new+1] = img_mem[pos_old+j*4+1]; 
      my_img[j*3+pos_new+2] = img_mem[pos_old+j*4+2]; 

     } 
    } 

    free(img_mem); 


//All the pixels are installed in my_img 

    free(my_img); 

내 문제는 위의 코드는 컬러 이미지에 유용하지만, 그레이 스케일 이미지 나는 그것을 할 수없는 방법에 대해 설명합니다. 어떤 아이디어?

답변

2

문제는 당신은 당신의 입력 및 출력 이미지 형식에 대한 가정을 코드에 하드 코딩 된 번호를 가지고있다. 이런 식으로 작업하는 것은 그레이 스케일 원본 이미지의 정확한 형식과 결과 이미지를 원하는 형식에 따라 달라집니다.

이미지가 항상 8 비트 단일

for(int j=0; j<cols; j++) 
    { 
    my_img[j+pos_new] = img_mem[pos_old+j]; 
    } 

그러나 출력 이미지가는 경우 -을 : - 수로 그레이 스케일, 당신은 단순히 코드에 *4*3의 모든 항목을 제거 만 처리 하나의 채널에 최종 내부 루프를 감소 멀리 얻을 수 24 비트 (코드가 암시하는 것처럼)이면 *3의 모든 항목을 남겨두고 내부 루프를 읽어야합니다. -

for(int j=0; j<cols; j++) 
    { 
     my_img[j*3+pos_new] = img_mem[pos_old+j]; 
     my_img[j*3+pos_new+1] = img_mem[pos_old+j]; 
     my_img[j*3+pos_new+2] = img_mem[pos_old+j]; 

    } 

이렇게하면 24 비트의 그레이 스케일 값이 생성됩니다.

진정한 유연성을 얻으려면 colorSpace의 구성 요소를보고이를 기반으로 픽셀 처리 루프를 동적으로 코딩하거나 이미지 형식이 예상 한 것과 다른 경우 예외를 제거하거나 오류를 던져야합니다.

+0

동적으로 처리해야하는 경우에 대한 예를들시겠습니까? 감사. – Unheilig

관련 문제