CGImageRef消耗大量内存

时间:2013-12-17 06:07:35

标签: ios iphone cgimageref cifilter uigraphicscontext

我正在为我的某个应用程序屏幕创建模糊图像,为此我使用以下代码


UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];


CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:5] forKey:@"inputRadius"];
CIImage *result = [filter valueForKey:kCIOutputImageKey];

CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

blurrImage = [UIImage imageWithCGImage:cgImage];
  self.blurrImageView.image = blurrImage;
  CGImageRelease(cgImage);


形成上面的代码我得到了正确的模糊图像,但问题出在CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];这一行。

此行内存使用情况显示正常,但此行内存使用量异常增加后

听到是执行前显示的内存使用情况的屏幕截图。内存使用率随着此方法的执行而不断增加,这是在

之前

enter image description here

并执行行CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

后执行此操作

enter image description here

这是常见的行为吗?我搜索了答案,但我没有得到,所以任何人都面临同样的问题,请帮助我

我有一件事“不使用ARC”

2 个答案:

答案 0 :(得分:1)

您使用屏幕截图的事实可能会改变内存使用情况,视网膜显示屏可能更像普通设备。在我看来,doubled是可以的,因为你有原始的UIImage和生活在内存中的模糊图像,也许上下文会留下一些记忆。我猜了一下:

  • 你使用了很多自动释放的对象,它们会留在内存中 直到池耗尽,尝试将代码包装在一个 autoreleaseblock


@autoreleasepool{
 UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];


CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:5] forKey:@"inputRadius"];
CIImage *result = [filter valueForKey:kCIOutputImageKey];

CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

blurrImage = [UIImage imageWithCGImage:cgImage];
  self.blurrImageView.image = blurrImage;
  CGImageRelease(cgImage);
}

答案 1 :(得分:1)

我遇到与Core Image相同的内存消耗问题。

如果您正在寻找替代品,在iOS 7中,您可以使用UIImage+ImageEffects类别,该类别在WWDC 2013 sample code页面的iOS_UIImageEffects项目中提供。它提供了一些新方法:

- (UIImage *)applyLightEffect;
- (UIImage *)applyExtraLightEffect;
- (UIImage *)applyDarkEffect;
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;
- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage;

这些不会受到Core Image遇到的内存消耗问题的影响。 (另外,它是一种更快速的模糊算法。)

WWDC 2013视频Implementing Engaging UI on iOS中说明了这种技术。