我的任务是从 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);
我的问题是上面的代码对于彩色图像很有用,但对于灰度图像我不知道该怎么做。有什么想法吗?
最佳答案
问题是您的代码中有硬编码的数字,这些数字对您的输入和输出图像格式做出假设。这样做完全取决于灰度源图像的确切格式,同样取决于您希望生成的图像采用什么格式。
如果您确定图像始终是 8 位单 channel 灰度,那么您只需删除所有出现的 *4
和 *3
在您的代码中,并减少最终的内部循环以仅处理单个 channel :-
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 位的灰度值。
为了使其真正灵活,您应该查看颜色空间的组件,并基于此动态编码像素处理循环,或者如果图像格式不是您的代码所期望的,至少抛出某种异常或错误。
关于ios - 如何从 UIImage 对象获取所有图像像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19683538/