美文网首页毛玻璃iOS动画开发
iOS 开发_UIImage毛玻璃效果(真正的毛玻璃~~)

iOS 开发_UIImage毛玻璃效果(真正的毛玻璃~~)

作者: iOS_PM_WEB_尛鹏 | 来源:发表于2017-04-19 12:49 被阅读542次

    【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进!

    1.应用场景:

    Paste_Image.png

    2.实现目标:

    通过对图片的处理,实现毛玻璃效果,这里因为有些时候模糊程度是因具体需求变化的,所以把方法写活了,方便大家的调用。

    3.代码说明:

    方式一,推荐使用,效果比较好

    #pragma mark -
    #pragma mark - yp_blurryImage: withBlurLevel: 传入图片返回设置毛玻璃效果后的图片
    /** Attention points:
    ① 需要引入#import <Accelerate/Accelerate.h>  
    ② 传入变量 blur 代表毛玻璃设置的程度,值越大越模糊 范围须在0-1中间,默认为0.5
    */
    - (UIImage *)yp_blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {
        if (blur < 0.f || blur > 1.f) {
            blur = 0.5f;
        }
        int boxSize = (int)(blur * 100);
        boxSize = boxSize - (boxSize % 2) + 1;
        CGImageRef img = image.CGImage;
        vImage_Buffer inBuffer, outBuffer;
        vImage_Error error;
        void *pixelBuffer;
        CGDataProviderRef inProvider = CGImageGetDataProvider(img);
        CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
        inBuffer.width = CGImageGetWidth(img);
        inBuffer.height = CGImageGetHeight(img);
        inBuffer.rowBytes = CGImageGetBytesPerRow(img);
        inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
        pixelBuffer = malloc(CGImageGetBytesPerRow(img) *
                             CGImageGetHeight(img));
        if(pixelBuffer == NULL)
            NSLog(@"No pixelbuffer");
        outBuffer.data = pixelBuffer;
        outBuffer.width = CGImageGetWidth(img);
        outBuffer.height = CGImageGetHeight(img);
        outBuffer.rowBytes = CGImageGetBytesPerRow(img);
        error = vImageBoxConvolve_ARGB8888(&inBuffer,
                                           &outBuffer,
                                           NULL,
                                           0,
                                           0,
                                           boxSize,
                                           boxSize,
                                           NULL,
                                           kvImageEdgeExtend);
        if (error) {
            NSLog(@"error from convolution %ld", error);
        }
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef ctx = CGBitmapContextCreate(
                                                 outBuffer.data,
                                                 outBuffer.width,
                                                 outBuffer.height,
                                                 8,
                                                 outBuffer.rowBytes,
                                                 colorSpace,
                                                 kCGImageAlphaNoneSkipLast);
        CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
        UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
        //clean up
        CGContextRelease(ctx);
        CGColorSpaceRelease(colorSpace);
        free(pixelBuffer);
        CFRelease(inBitmapData);
        CGColorSpaceRelease(colorSpace);
        CGImageRelease(imageRef);
        return returnImage;
    }
    
    //使用时直接调用即可
    UIImage * image = [UIImage imageNamed:@"wukong"];
    self.blurryImageView.image = [self yp_blurryImage:image withBlurLevel:0.1];
    

    方式二,代码简洁,效果欠佳

    //创建毛玻璃
    UIBlurEffect * blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
    UIVisualEffectView * effe = [[UIVisualEffectView alloc] initWithEffect:blur];
    //毛玻璃大小与所需要添加毛玻璃效果的大小一致
    effe.frame = CGRectMake(0,0,self.blurryImageView.frame.size.width - 100,self.blurryImageView.frame.size.width - 100);
    effe.layer.masksToBounds = YES;
    effe.layer.cornerRadius = 5;
    //透明度为1时,毛玻璃程度为最明显
    effe.alpha = 0.5;
    //把要添加的视图加到毛玻璃上
    [self.blurryImageView addSubview:effe];
    

    两种方法均设置为0.5时的效果如下图

    Paste_Image.png

    相关文章

      网友评论

      • 铅笔人生:有使用swift 3.0 写过demo吗? 有的地方翻译的时候,翻译不过来,问问有没有方法转一下
        铅笔人生:@SuperGod汤丶尛鹏 已翻译好,可以不用混用,就不想混用:smile:。谢谢答复
        iOS_PM_WEB_尛鹏:额,做下桥接混编不行么...干嘛那么费事去适配swift3.0的语言:disappointed_relieved:
        铅笔人生:1498893132,有的话请加一qq给下指点

      本文标题:iOS 开发_UIImage毛玻璃效果(真正的毛玻璃~~)

      本文链接:https://www.haomeiwen.com/subject/rgiczttx.html