我有一个像这样创建的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];根据文献资料,这将返回一个由五个字符指针组成的C数组。但它怎么能做到呢?因为参数的类型是unsigned char **,所以它只能返回char的数组,而不能返回char指针的数组。
因此,这让我想知道如何访问各个像素。你知道怎么做吗?
(我知道有– setColor:atX:y:方法,但如果对大位图的每一个像素进行调用,它似乎会非常慢。)
发布于 2010-03-26 19:17:59
如果您只想迭代像素,-bitmapData应该是您所需要的。
发布于 2010-03-27 03:00:27
根据文档,这将返回一个由五个字符指针组成的C数组。但它怎么能做到呢?因为参数的类型是
unsigned char **,所以它只能返回字符数组,而不能返回char指针数组。
不正确。unsigned char **是至少一个指向至少一个unsigned char的指针。
因此,您应该传递一个指向指针数组的指针,即指向数组数组的指针。就像这样:
unsigned char *buffers[5];
[bitmapImageRep getBitmapDataPlanes:buffers];如果图像代表是平面的,那么buffers的每个元素都是指向组件平面的指针;对于RGB,buffers[0]是红色平面,buffers[1]是绿色平面,buffers[2]是蓝色平面,buffers[3]是α平面。当然,每个平面都是一个缓冲区,保存该通道的值(如unsigned chars)。
如果图像代表不是平面的,那么您将只得到一个元素,即RGBA数据。
特别值得注意的是你链接到的文件中的这句话:
如果少于五个平面,则剩下的指针将设置为
NULL。
这意味着您显示的代码包含一个缓冲区溢出:您正在为一个指针传递一个指向存储的指针,但是图像代表希望存储不少于5个,它将给您五个指针和/或NULL,因此它将在存储结束后写入。这将粉碎您的堆栈,使您的应用程序崩溃,或者两者兼而有之。
https://stackoverflow.com/questions/2526001
复制相似问题