我像这样初始化数组

CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, bounds);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
unsigned char *rawData = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);


但是,当我尝试通过NSLog检查计数时,总是得到4(特别是4/1)。

int count = sizeof(rawData)/sizeof(rawData[0]);
NSLog(@"%d", count);


但是,当我NSLog单个元素的值时,它将返回非零值。

例如
     CGFloat f1 = rawData[15];

CGFloat f2 = rawData[n],其中nimage width*height*4;

//我没想到这会起作用,因为最后一个元素应该是n-1

最后,我尝试了

int n = lipBorder.size.width *lipBorder.size.height*4*2; //lipBorder holds the image's dimensions, I tried multiplying by 2 because there are 2 pixels for every CGPoint in retina
CGFloat f = rawData[n];


对于同一张图片,每次都会返回不同的值(例如0.000、115.000、38.000)。

如何确定计数/将值如何存储到数组中?

最佳答案

rawData是指向无符号字符的指针,因此其大小为32位(4字节)[1]。 rawData[0]是一个无符号字符,因此其大小为8位(1个字节)。因此,4/1

您可能之前已经看过使用数组完成此操作,并且可以按预期工作:

unsigned char temp[10] = {0};
NSLog(@"%d", sizeof(temp)/sizeof(temp[0])); // Prints 10


但是请注意,您要处理的是指向无符号字符的指针,而不是无符号字符数组的指针-语义是不同的,因此为什么这不适用于您的情况。

如果您想要缓冲区的大小,那么简单地使用height * width * 4会更好,因为无论如何这都是您传递给malloc的。如果确实需要,可以将其除以sizeof(char)sizeof(rawData[0])以获取元素的数量,但是由于它们是字符,因此无论如何您都将获得相同的数量。

现在,rawData只是某个地方的一块内存。前后还有其他记忆。因此,如果您尝试执行类似rawData[height * width * 4]的操作,那么实际上您正在尝试访问分配给rawData的块之后的下一个内存字节。这是未定义的行为,可能会导致返回随机垃圾值[2](如您所观察到的),返回某些“未分配的内存”标记值或发生分段错误。


[1]:iOS是32位平台
[2]:可能是上次合法使用该内存位置时所放入的任何值。

关于ios - 将UIImage像素数据存储到c数组中,无法确定数组的元素数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18303615/

10-10 09:10