应用核心图像过滤器时处理内存警告

时间:2012-09-06 14:00:07

标签: ios automatic-ref-counting core-image

我正在使用followinf代码来应用图像过滤器。这在缩小的图像上工作正常。 但是当我在全分辨率图像上应用2个以上的滤镜时,应用程序崩溃了。收到内存警告。

当我打开'allocations'工具时,我看到CFData(存储)占用了程序使用的大部分内存。 当我在全分辨率图像上应用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设为零。没有帮助。 我尝试将上下文声明和定义放在第二个函数中。没有帮助。 我试图在函数内部移动声明和过滤器的定义,但没有帮助。

同样崩溃发生在

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

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:1)

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

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

所以我应用过滤器,之后调用相同的过滤器,图像为'nil'。在应用所有4个滤镜后,这会将内存恢复为484kb或48 MB的内存。

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