0

在我的项目中,我必须制作屏幕截图并应用模糊来创建磨砂玻璃的效果。内容可以在玻璃下移动,然后调用 bluredImageWithRect: 方法。我正在尝试优化以下方法以加快应用程序的速度。将模糊过滤器应用于屏幕截图时会发生重大损失,因此我正在寻找一种以较低分辨率截取屏幕截图的方法,对屏幕截图应用模糊,然后将其拉伸以适合某些矩形。

- (CIImage *)bluredImageWithRect:(CGRect)rect {

    CGSize smallSize = CGSizeMake(rect.size.width, rect.size.height);

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(nil, smallSize.width, smallSize.height, 8, 0, colorSpaceRef, kCGImageAlphaPremultipliedFirst);
    CGContextClearRect(ctx, rect);
    CGColorSpaceRelease(colorSpaceRef);
    CGContextSetInterpolationQuality(ctx, kCGInterpolationNone);
    CGContextSetShouldAntialias(ctx, NO);
    CGContextSetAllowsAntialiasing(ctx, NO);

    CGContextTranslateCTM(ctx, 0.0, self.view.frame.size.height);
    CGContextScaleCTM(ctx, 1, -1);

    CGImageRef maskImage = [UIImage imageNamed:@"mask.png"].CGImage;
    CGContextClipToMask(ctx, rect, maskImage);


    [self.view.layer renderInContext:ctx];

    CGImageRef imageRef1 = CGBitmapContextCreateImage(ctx);

    CGContextRelease(ctx);

    NSDictionary *options = @{(id)kCIImageColorSpace : (id)kCFNull};
    CIImage *beforeFilterImage = [CIImage imageWithCGImage:imageRef1 options:options];

    CGImageRelease(imageRef1);

    CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:kCIInputImageKey, beforeFilterImage,  @"inputRadius", [NSNumber numberWithFloat:3.0f], nil];
    CIImage *afterFilterImage = blurFilter.outputImage;

    CIImage *croppedImage = [afterFilterImage imageByCroppingToRect:CGRectMake(0, 0, smallSize.width, smallSize.height)];

    return croppedImage;
}
4

1 回答 1

1

这是一个使用加速框架的 iOS 图像处理教程,它展示了如何做一个足够快的模糊效果来满足你的需要。

于 2012-10-25T06:00:14.853 回答