2

我正在使用以下代码来应用图像过滤器。这在按比例缩小的图像上效果很好。但是当我在全分辨率图像上应用超过 2 个过滤器时,应用程序会崩溃。收到内存警告。

当我打开“分配”工具时,我看到 CFData(store) 占用了程序使用的大部分内存。当我在全分辨率图像上应用超过 2 个过滤器时,“总字节数”高达 54MB。虽然当我用眼睛观察这些数字时,“活动字节”似乎没有超过 12MB,但峰值表明活动字节也达到了这个数字并回来了。

我哪里错了?

- (UIImage *)editImage:(UIImage *)imageToBeEdited tintValue:(float)tint 
{ 
CIImage *image = [[CIImage alloc] initWithImage:imageToBeEdited]; 
NSLog(@"in edit Image:\ncheck image: %@\ncheck value:%f", image, tint); 

[tintFilter setValue:image forKey:kCIInputImageKey]; 
[tintFilter setValue:[NSNumber numberWithFloat:tint] forKey:@"inputAngle"]; 

CIImage *outputImage = [tintFilter outputImage]; 
NSLog(@"check output image: %@", outputImage); 
return [self completeEditingUsingOutputImage:outputImage]; 
} 

- (UIImage *)completeEditingUsingOutputImage:(CIImage *)outputImage 
{ 
CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage.extent]; 
NSLog(@"check cgimg: %@", cgimg); 
UIImage *newImage = [UIImage imageWithCGImage:cgimg]; 
NSLog(@"check newImge: %@", newImage); 
CGImageRelease(cgimg); 
return newImage; 
} 

编辑:我也尝试将 cgimg 设为 nil。没有帮助。我尝试将上下文声明和定义放在第二个函数中。没有帮助。我试图在函数内移动过滤器的声明和定义,但没有帮助。

AlsoCrash 发生在

CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage.extent]; 
4

2 回答 2

1
// where is your input filter name like this:

[tintFilter setValue:image forKey:@"CIHueAdjust"];

// I think you have a mistake in outputImage.extent. You just write this 

CGImageRef cgimg = [context createCGImage:outputImage fromRect:outputImage extent];
于 2012-09-17T07:24:33.917 回答
1

我正在制作的 cgimg 占用了内存中的大部分空间并且没有被释放。

我观察到调用具有较小值的文件管理器会将 CFData(存储)内存值恢复为更小的值,从而避免崩溃。

所以我应用过滤器,然后使用图像作为“nil”调用相同的过滤器。在应用所有 4 个过滤器后,这会将内存恢复到 484kb 或 48 MB。

另外,我在后台线程而不是主线程上应用这个过滤器。再次应用于主线程会导致崩溃。可能它没有足够的时间来释放内存。我不知道。但这些事情现在进展顺利。

于 2012-09-17T11:15:20.820 回答