我正在为我的某个应用程序屏幕创建模糊图像,为此我使用以下代码
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”
答案 0 :(得分:1)
您使用屏幕截图的事实可能会改变内存使用情况,视网膜显示屏可能更像普通设备。在我看来,doubled是可以的,因为你有原始的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);
}
答案 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中说明了这种技术。