gpt4 book ai didi

ios - 将 UIImage 像素数据存储到 c 数组中,无法确定数组的元素计数

转载 作者:行者123 更新时间:2023-11-29 03:41:55 25 4
gpt4 key购买 nike

我像这样初始化了数组

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图片宽*高*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 是指向 unsigned char 的指针,因此其大小为 32 位(4 字节)[1]rawData[0] 是一个无符号字符,因此其大小为 8 位(1 字节)。因此,4/1

您以前可能已经见过使用数组完成此操作,它确实按照您的预期工作:

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

但是请注意,您正在处理指向 unsigned char 的指针,而不是 unsigned char 的数组 - 语义不同,因此为什么这不一样适合您的情况。

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

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


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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com