如何加速图像模糊?

时间:2014-10-22 23:48:52

标签: objective-c ipad uiimage ios8 uiblureffect

我在一个模态uiviewcontroller中的viewWillAppear中有以下代码。

我在此示例中包含UIImage + ImageEffects.h来模糊背景图像。

-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:NO];

// grab an image of our parent view
UIView *parentView = self.presentingViewController.view;

UIImage *parentViewImage = [self takeSnapshotOfView:parentView];

UIImage *blurredImage = nil;

//BLUR THE IMAGE
blurredImage = [self blurWithImageEffects:parentViewImage];

// insert an image view with a picture of the parent view at the back of our view's subview stack...
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
imageView.image = blurredImage;
[self.view insertSubview:imageView atIndex:0];

}

[编辑]添加模糊方法

- (UIImage *)takeSnapshotOfView:(UIView *)view
{
    CGFloat reductionFactor = 1.5;
    UIGraphicsBeginImageContext(CGSizeMake(view.frame.size.width/reductionFactor, view.frame.size.height/reductionFactor));
    [view drawViewHierarchyInRect:CGRectMake(0, 0, view.frame.size.width/reductionFactor, view.frame.size.height/reductionFactor) afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

- (UIImage *)blurWithImageEffects:(UIImage *)image
{
    return [image applyBlurWithRadius:10 tintColor:[UIColor colorWithWhite:1 alpha:0.2] saturationDeltaFactor:1.5 maskImage:nil];
}

代码工作正常,背景显示模糊,但在使用iOS 8的iPad 3上显然非常慢。当显示此视图控制器的按钮被点击时,在视图控制器从底部向上滑动之前有一个暂停。如果我移除模糊,视图控制器会更快地滑动。

我尝试将代码放在viewDidAppear中,但是在模糊出现之前显示了几秒钟的明显白色背景。但是当在viewDidAppear中时,viewcontroller会立即向上滑动。

如果我减少applyWithBlurRadius值,这似乎不会减少应用模糊所需的时间。

有什么方法可以让它跑得更快吗?

1 个答案:

答案 0 :(得分:0)

GPUImage可能会解决您的问题,它速度快,而且不会给处理带来太多负担。

链接到框架:https://github.com/BradLarson/GPUImage

使用GPUImage模糊链接

但是下面会显示一个参考资料,它将为您提供基本的想法:

首先准备要模糊的视图:

- (NSData *)PhotoForBlurring:(UIView *)view{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 1.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    NSData * data = UIImagePNGRepresentation(image);
    [data writeToFile:@"aName.png" atomically:YES];
    return data; }

-(void)sharingScrapPage{
     GPUImageiOSBlurFilter *blur = [[GPUImageiOSBlurFilter alloc]init];
     blur.blurRadiusInPixels=2.0;
     blur.downsampling=6.0;

     [blurview removeFromSuperview];
     blurview = [[UIImageView alloc]initWithFrame:getRectDisplay(0, 0, 480, 320)]; // Landscape Iphone 4S
     UIImage *imageForBlurring=[UIImage imageWithData:[self PhotoForBlurring:self.view]];
     NSData* pngdataForBlurring = UIImagePNGRepresentation (imageForBlurring);
     UIImage* blurImage = [UIImage imageWithData:pngdataForBlurring];
     blurImage=[blur imageByFilteringImage:blurImage];
     blurview.image=blurImage;
     [self.view addSubview:blurview];

     [progressHUD removeFromSuperview];
     progressHUD = [[ProgressHUD alloc]initWithFrame:getRectDisplay(190, 110, 100, 90)];
     [blurview addSubview:progressHUD]; }