2

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


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]];在这一行。

到这行内存使用显示是正常的,但是在这行内存使用增加后异常高,

听到的是执行前显示的内存使用截图。内存使用随着这个方法的执行而不断增加,这是之前

在此处输入图像描述

这在执行该行之后 CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

在此处输入图像描述

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

一件事我“不使用ARC”

4

2 回答 2

1

您使用屏幕截图的事实可能会改变内存使用情况,视网膜显示器可能比普通设备更多。在我看来,加倍是可以的,因为你有原始的 UIImage 和模糊图像存在于内存中,可能上下文也会保留一些内存。我猜测:

  • 您正在使用大量自动释放的对象,它们将留在内存中直到池耗尽,尝试将代码包装在自动释放块中


@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);
}
于 2013-12-17T06:57:12.420 回答
1

我在使用 Core Image 时遇到了同样的内存消耗问题。

如果您正在寻找替代方案,在 iOS 7 中,您可以使用UIImage+ImageEffectscategory,它作为iOS_UIImageEffects项目的一部分在WWDC 2013 示例代码页中提供。它提供了一些新方法:

- (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 视频Implementation Engaging UI on iOS中有说明。

于 2013-12-17T09:24:18.103 回答