Objective c 如何访问NSBitmapImageRep的像素?

Objective c 如何访问NSBitmapImageRep的像素?,objective-c,cocoa,pointers,image-manipulation,core-graphics,Objective C,Cocoa,Pointers,Image Manipulation,Core Graphics,我有一个NSBitmapImageRep,它是这样创建的: NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:waveformSize.width

我有一个
NSBitmapImageRep
,它是这样创建的:

NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] 
                              initWithBitmapDataPlanes:NULL
                                            pixelsWide:waveformSize.width
                                            pixelsHigh:waveformSize.height
                                         bitsPerSample:8
                                       samplesPerPixel:4
                                              hasAlpha:YES
                                              isPlanar:YES
                                        colorSpaceName:NSCalibratedRGBColorSpace
                                           bytesPerRow:0
                                          bitsPerPixel:0];
unsigned char *buffers[5];
[bitmapImageRep getBitmapDataPlanes:buffers];
现在我想访问像素数据,所以我使用

unsigned char *bitmapData;
[imageRep getBitmapDataPlanes:&bitmapData];
根据这一点,返回一个包含五个字符指针的C数组。但它怎么能做到这一点呢?由于参数的类型是
无符号字符**
,因此它只能返回
char
s数组,而不能返回
char
指针数组

因此,这让我想知道如何访问单个像素。你知道怎么做吗


(我知道有一种方法,
–setColor:atX:y:
,但如果对大位图的每个像素调用,它似乎非常慢。)

如果您只想在像素上迭代,则只需要-bitmapData

根据文档,这将返回一个包含五个字符指针的C数组。但它怎么能做到这一点呢?由于参数的类型是
无符号字符**
,因此它只能返回字符数组,而不能返回字符指针数组

不对
unsigned char**
是指向至少一个
unsigned char
的指针

所以,应该传递一个指向指针数组的指针,也就是指向数组数组的指针。大概是这样的:

NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] 
                              initWithBitmapDataPlanes:NULL
                                            pixelsWide:waveformSize.width
                                            pixelsHigh:waveformSize.height
                                         bitsPerSample:8
                                       samplesPerPixel:4
                                              hasAlpha:YES
                                              isPlanar:YES
                                        colorSpaceName:NSCalibratedRGBColorSpace
                                           bytesPerRow:0
                                          bitsPerPixel:0];
unsigned char *buffers[5];
[bitmapImageRep getBitmapDataPlanes:buffers];
如果图像代表是平面的,则
缓冲区的每个元素将是指向组件平面的指针;对于RGB,
buffers[0]
是红色平面,
buffers[1]
是绿色平面,
buffers[2]
是蓝色平面,
buffers[3]
是阿尔法平面。当然,每个平面都是一个缓冲区,保存该通道的值(如
unsigned char
s)

如果图像代表不是平面的,则只会得到一个元素,即RGBA数据

特别值得注意的是,这句话来自您链接到的文档:

如果少于五个平面,其余指针将设置为
NULL


这意味着您显示的代码包含缓冲区溢出:您正在为一个指针传递一个指向存储器的指针,但image rep希望存储器不少于五个,并且它将为您提供五个指针和/或
NULL
s,因此它将在您提供的存储器的末尾之外写入。这将破坏堆栈、崩溃应用程序或两者兼而有之。

只返回指向第一个平面的指针。对于平面图像,这意味着我只能访问红色值…因此您建议使用非平面图像来代替?因此,每个平面都表示为单个
无符号字符
?这是一个强大的
无符号字符
,可以容纳数千像素。我的问题是:如何在8位中保存数千像素?Paperflyer:否。请重新阅读声明:
无符号字符*缓冲区[5]
是一个由五个指针组成的数组,每个指针至少指向一个
无符号字符
。每个平面都是
无符号字符的数组。您可以得到一个由五个指针组成的数组,最多可以指向五个数组。