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]
是一个由五个指针组成的数组,每个指针至少指向一个无符号字符
。每个平面都是无符号字符的数组。您可以得到一个由五个指针组成的数组,最多可以指向五个数组。