2013-10-30 83 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

相关问题