2014-10-22 2 views
0

У меня есть следующий код в моем представленииWillAppear в модальном uiviewcontroller.Как ускорить размытие изображения?

В этом примере я использую 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]; 

} 

[EDIT] Добавление методов Размытие

- (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]; 
} 

код прекрасно работает и на фоне появляется размыто, но это действительно заметно медленно на IPad 3 с прошивкой 8. При нажатии на кнопку, чтобы отобразить эту ViewController нажата пауза до того, как viewcontroller соскальзывает снизу. Если я удалю размытие, контроллер просмотра ускорится.

Я попытался поместить код в viewDidAppear, но затем на несколько секунд появится заметный белый фон, прежде чем появится размытие. Но когда в viewDidAppear viewcontroller немедленно сместится.

Если я уменьшу значение applyWithBlurRadius, это не уменьшит время, необходимое для применения размытия.

Есть ли способ заставить его работать быстрее?

+0

Вы можете попробовать UIVisualEffect для устройств iOS 8. – skorulis

+0

@skorulls Я бы, но у меня, похоже, не было такого же уровня контроля с помощью UIVisualEffects, поскольку есть только 3 уровня размытия, которые я не могу изменить. Я обновил свой вопрос с помощью метода размытия изображения. – motionpotion

ответ

0

GPUImage может решить вашу проблему, ее быстро и не накладывает слишком много нагрузки на обработку.

Ссылка на Framework: 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]; } 
Смежные вопросы