gpt4 book ai didi

iphone - iPhone/iPad 上的 CGBitmapContextCreate

转载 作者:行者123 更新时间:2023-12-03 18:44:50 27 4
gpt4 key购买 nike

我有一个方法,需要逐像素解析一堆大型 PNG 图像(每个 PNG 都是 600x600 像素)。它似乎在模拟器上工作得很好,但在设备(iPad)上,我在某些内部内存复制功能中得到了 EXC_BAD_ACCESS 。看起来尺寸是罪魁祸首,因为如果我在较小的图像上尝试,一切似乎都有效。这是下面方法中与内存相关的内容。

+ (CGRect) getAlphaBoundsForUImage: (UIImage*) image 
{
CGImageRef imageRef = [image CGImage];

NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

unsigned char *rawData = malloc(height * width * 4);
memset(rawData,0,height * width * 4);

NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);

/* non-memory related stuff */

free(rawData);

当我在一堆图像上运行这个程序时,它运行了 12 次然后就崩溃了,而在模拟器上它运行没有问题。大家有什么想法吗?

最佳答案

运行 12 次然后崩溃听起来像是内存不足的问题。 CGContext 可能在内部创建一些大型自动释放结构。由于您在循环中执行此操作,因此它们不会被释放,因此您会耗尽内存并死亡。

不过我不确定 Core Foundation 如何处理临时对象。我不认为 CF 对象具有相当于自动释放的功能,并且 Core Graphics 上下文几乎肯定是在处理 CF 对象而不是 NSObject。

为了减少代码中的内存流失,我建议在开始处理之前重构它以创建一个离屏 CGContext 一次,并重复使用它来处理每个图像。完成后释放它。无论如何,这都会更快(因为您不会在每次循环时分配巨大的数据结构。)

我打赌这会消除你的崩溃问题,而且我打赌它也会使你的代码变得更快。与其他操作相比,内存分配非常慢,并且您需要使用一些相当大的数据结构来处理 600x600 像素 RGBA 图像。

关于iphone - iPhone/iPad 上的 CGBitmapContextCreate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2619224/

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