iOS实现模糊效果

本文介绍了在iOS中实现模糊效果的两种方法:一种是对图片直接处理增加模糊效果,另一种是利用UIVisualEffectView覆盖在内容上。示例代码展示了如何使用UIBlurEffect和UIVisualEffectView创建模糊视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现模糊效果有两种方式:

第一种是直接对图片做处理,增加模糊效果,然后替换之前的图片;

- (void)setImageToBlur: (UIImage *)image
            blurRadius: (CGFloat)blurRadius
{
    CIContext *context   = [CIContext contextWithOptions:nil];
    CIImage *sourceImage = [CIImage imageWithCGImage:image.CGImage];
    
    // Apply clamp filter:
    // this is needed because the CIGaussianBlur when applied makes
    // a trasparent border around the image
    
    NSString *clampFilterName = @"CIAffineClamp";
    CIFilter *clamp = [CIFilter filterWithName:clampFilterName];
    
    if (!clamp) {
        return;
    }
    
    [clamp setValue:sourceImage
             forKey:kCIInputImageKey];
    
    CIImage *clampResult = [clamp valueForKey:kCIOutputImageKey];
    
    // Apply Gaussian Blur filter
    
    NSString *gaussianBlurFilterName = @"CIGaussianBlur";
    CIFilter *gaussianBlur           = [CIFilter filterWithName:gaussianBlurFilterName];
    
    if (!gaussianBlur) {
        return;
    }
    
    [gaussianBlur setValue:clampResult
                    forKey:kCIInputImageKey];
    [gaussianBlur setValue:[NSNumber numberWithFloat:blurRadius]
                    forKey:@"inputRadius"];
    
    CIImage *gaussianBlurResult = [gaussianBlur valueForKey:kCIOutputImageKey];
    
    __weak UIImageView *selfWeak = self;
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        CGImageRef cgImage = [context createCGImage:gaussianBlurResult
                                           fromRect:[sourceImage extent]];
        
        UIImage *blurredImage = [UIImage imageWithCGImage:cgImage];
        CGImageRelease(cgImage);
        
        dispatch_async(dispatch_get_main_queue(), ^{
            selfWeak.image = blurredImage;
        });
    });
}


第二种是创建一个UIVisualEffectView对象,然后把它放在需要模糊的内容上面,实现模糊效果;

imageview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20,200, 200)];

imageview.contentMode = UIViewContentModeScaleAspectFit;

imageview.userInteractionEnabled = YES;

[self.view addSubview:imageview];

UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *effectview = [[UIVisualEffectView alloc] initWithEffect:blur];

effectview.frame = CGRectMake(0, 0, imageview.frame.size.width/2, 300);

[imageview addSubview:effectview];

// UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];

//

// btn.frame = CGRectMake(10, 50, 100, 40);

//

// [btn setTitle:@"btn" forState:UIControlStateNormal];

//

// [effectview.contentView addSubview:btn];

相对实现来说,第二种简单一点,但是还是要看具体需求来选择使用哪种方式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值