【问题标题】:How can I obtain all the image pixels from a UIImage object [duplicate]如何从 UIImage 对象中获取所有图像像素 [重复]
【发布时间】:2013-10-30 13:26:06
【问题描述】:

我的任务是从 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);

我的问题是上面的代码对彩色图像很有用,但对于灰度图像我不知道怎么做。有什么想法吗?

【问题讨论】:

    标签: ios objective-c uiimage


    【解决方案1】:

    问题在于您的代码中有硬编码的数字,这些数字会假设您的输入和输出图像格式。这样做完全取决于灰度源图像的确切格式,同样取决于您希望生成的图像采用什么格式。

    如果您确定图像将始终是 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 位灰度值。

    要使其真正灵活,您应该查看颜色空间的组件并基于此动态编码像素处理循环,或者如果图像格式不是您的代码所期望的,至少抛出某种异常或错误。

    【讨论】:

    • 您能否举一个例子来说明我们需要动态执行此操作的情况?谢谢。
    【解决方案2】:

    请参考链接上的类别(UIImage+Pixels):http://b2cloud.com.au/tutorial/obtaining-pixel-data-from-a-uiimage

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      相关资源
      最近更新 更多