我有一个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 *bitmapData;
[imageRep getBitmapDataPlanes:&bitmapData];
根据the Documentation,它返回一个包含五个字符指针的C数组。但它怎么能这样做呢?由于参数的类型为unsigned char **
,因此它只能返回char
个数组,而不能返回char
指针数组。
所以,这让我想知道如何访问各个像素。你知道怎么做吗?
(我知道有方法– setColor:atX:y:
,但如果为大位图的每个像素调用它似乎相当慢。)
答案 0 :(得分:1)
如果你只想迭代像素,那么-bitmapData应该就是你所需要的。
答案 1 :(得分:0)
根据文档,这将返回一个包含五个字符指针的C数组。但它怎么能这样做呢?由于参数的类型是
unsigned char **
,它只能返回一个字符数组,但不能返回一个字符串数组。
不正确的。 unsigned char **
是指向至少一个指向至少一个unsigned char
的指针。
因此,您应该将指针传递给指针数组 - 即指向数组数组的指针。像这样:
unsigned char *buffers[5];
[bitmapImageRep getBitmapDataPlanes:buffers];
如果图像rep是平面的,则buffers
的每个元素将是指向组件平面的指针;对于RGB,buffers[0]
是红色平面,buffers[1]
是绿色平面,buffers[2]
是蓝色平面,buffers[3]
是alpha平面。当然,每个平面都是一个缓冲区,用于保存该通道的值(如unsigned char
s)。
如果图像代表不是平面的,那么您将只获得一个元素,即RGBA数据。
特别值得注意的是您链接到的文档中的这句话:
如果少于五个平面,其余指针将设置为
NULL
。
这意味着您显示的代码包含缓冲区溢出:您正在为一个指针传递指向存储的指针,但图像代表期望存储不少于五个,并且将给出你有五个指针和/或NULL
s,所以它将在你给它的存储结束之后写。这会粉碎你的堆栈,崩溃你的应用程序,或两者兼而有之。