iOS-在其他视图上设置模糊图像,奇怪的问题

iOS-在其他视图上设置模糊图像,奇怪的问题,ios,objective-c,cocoa-touch,gpuimage,Ios,Objective C,Cocoa Touch,Gpuimage,所以,我有一个奇怪的场景 在我的iOS应用程序中,我试图在打开popover时模糊屏幕的内容区域。 当使用核心图像时,我有这种效果,但只有在使用高斯模糊时,其他模糊都不起作用,这很奇怪 我试着用GPUImage做同样的事情,它模糊的速度要快得多,但实际上并没有把视图放在其他视图之上 总而言之:在下面的源代码中,setBlurOnView将正常工作-但是setBlurOnViewWithGPUImage似乎无法工作。模糊视图(标签6110)已创建,但应用程序实际上并不模糊 注意:这是在iOS 6上

所以,我有一个奇怪的场景

在我的iOS应用程序中,我试图在打开popover时模糊屏幕的内容区域。 当使用核心图像时,我有这种效果,但只有在使用高斯模糊时,其他模糊都不起作用,这很奇怪

我试着用GPUImage做同样的事情,它模糊的速度要快得多,但实际上并没有把视图放在其他视图之上

总而言之:在下面的源代码中,setBlurOnView将正常工作-但是setBlurOnViewWithGPUImage似乎无法工作。模糊视图(标签6110)已创建,但应用程序实际上并不模糊

注意:这是在iOS 6上的模拟器中

以下是相关来源:

//  ScreenBlur.m

#import <QuartzCore/QuartzCore.h>
#import <CoreImage/CoreImage.h>
#import <GPUImage/GPUImage.h>

#import "ScreenBlur.h"
#import "GlobalData.h"
#import "Logger.h"

@implementation ScreenBlur

+ (void) setBlurOnViewWithGPUImage:(UIView*)view {
    GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:[self captureScreenInRect:view.frame inView:view]];
    GPUImageGaussianBlurFilter *blur = [[GPUImageGaussianBlurFilter alloc] init];

    [imageSource addTarget:blur];
    [imageSource processImage];

    [self setImage:[imageSource imageFromCurrentlyProcessedOutput] toView:view];
}

+ (void) setBlurOnView:(UIView *)view {
    //http://stackoverflow.com/questions/17041669/creating-a-blurring-overlay-view

    CIImage *inputImage = [CIImage imageWithCGImage:[self captureScreenInRect:view.frame inView:view].CGImage];
    //CIContext *context = [CIContext contextWithOptions:nil];
    if ([GlobalData getInstance].ciContext == nil) {
        [Logger Log:@"ciContext does not exist, creating..." fromClass:@"ScreenBlur"];
//        [GlobalData getInstance].ciContext = [CIContext contextWithOptions:nil]; //cpu context
        [GlobalData getInstance].ciContext = [CIContext contextWithEAGLContext:[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]];
    }


    //set up the blur filter
    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    [filter setValue:[NSNumber numberWithFloat:3.0f] forKey:@"inputRadius"];
    CIImage *result = [filter valueForKey:kCIOutputImageKey];

    // CIGaussianBlur has a tendency to shrink the image a little,
    // this ensures it matches up exactly to the bounds of our original image
    CGImageRef cgImage = [[GlobalData getInstance].ciContext createCGImage:result fromRect:[inputImage extent]];

    [self setImage:[UIImage imageWithCGImage:cgImage] toView:view];
}

+ (void) setImage:(UIImage*)blurredImage toView:(UIView*)view {
    UIView *blurView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, blurredImage.size.width, blurredImage.size.height)];
    [blurView setBackgroundColor:[UIColor colorWithPatternImage:blurredImage]];
    [blurView setTag:6110];

    //set the image as the foreground for the view
    [view addSubview:blurView];
    [view bringSubviewToFront:blurView];
}

//same as the method above, but resizes the screenshot before applying the blur for increased performance at the expense of image quality.
+ (void) setBlurOnViewPerformanceMode:(UIView *)view {
    //http://stackoverflow.com/questions/17041669/creating-a-blurring-overlay-view

    UIImage *screenShot = [self imageWithImage:[self captureScreenInRect:view.frame inView:view] scaledToSize:CGSizeMake(view.frame.size.width / 2, view.frame.size.height / 2)];
    CIImage *inputImage = [CIImage imageWithCGImage:screenShot.CGImage];
    //CIContext *context = [CIContext contextWithOptions:nil];
    if ([GlobalData getInstance].ciContext == nil) {
        [Logger Log:@"ciContext does not exist, creating..." fromClass:@"ScreenBlur"];
        //        [GlobalData getInstance].ciContext = [CIContext contextWithOptions:nil]; //cpu context
        [GlobalData getInstance].ciContext = [CIContext contextWithEAGLContext:[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]];
    }

    //set up the blur filter
    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    [filter setValue:[NSNumber numberWithFloat:3.0f] forKey:@"inputRadius"];
    CIImage *result = [filter valueForKey:kCIOutputImageKey];

    //CGImageRef cgImage = [[GlobalData getInstance].ciContext createCGImage:result fromRect:[inputImage extent]];
    CGImageRef cgImage = [[GlobalData getInstance].ciContext createCGImage:result fromRect:[inputImage extent]];

    [self setImage:[self imageWithImage:[UIImage imageWithCGImage:cgImage] scaledToSize:view.frame.size] toView:view];
}

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
    //UIGraphicsBeginImageContext(newSize);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}


+ (void) removeBlurFromView:(UIView *)view {
    for (UIView *subView in view.subviews) {
        if (subView.tag == 6110) {
            [subView removeFromSuperview];
        }
    }
}

+ (UIImage *)captureScreenInRect:(CGRect)captureFrame inView:(UIView*) view {
    CALayer *layer;
    layer = view.layer;
    UIGraphicsBeginImageContext(view.bounds.size);
    CGContextClipToRect (UIGraphicsGetCurrentContext(),captureFrame);
    [layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenImage;
}

@end

我找到了一个解决办法(或者,谁知道呢,也许这就是应该怎么做的)

[ScreenBlur setBlurOnView:self.view];
//ScreenBlur.m
+ (GPUImageView*) getBlurredImageWithGPUImageFromView:(UIView*)view {
    GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:[self captureScreenInRect:view.frame inView:view] smoothlyScaleOutput:true];

    GPUImageFastBlurFilter *blur = [[GPUImageFastBlurFilter alloc] init];
    [blur setBlurPasses:3];

    [imageSource addTarget:blur];

    GPUImageView *filteredView = [[GPUImageView alloc] initWithFrame:view.frame];
    [blur addTarget:filteredView];

    [imageSource processImage];


    return filteredView;
}

//ViewController.m
//blur the main screen
GPUImageView *blurred = [ScreenBlur getBlurredImageWithGPUImageFromView:self.view];
[blurred setTag:6110];
[self.view addSubview:blurred];
[self.view bringSubviewToFront:blurred];