我像这样初始化数组
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]
,其中n
是image 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/