2013-10-30 102 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位單一聲道灰度,那麼你就可以逃脫只需去除*4*3所有出現在你的代碼,並減少最終的內環只處理一個單一的通道: -

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

但是,如果輸出圖像是怎麼回事爲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

相關問題