美文网首页iOS初学者
iOS高斯模糊&毛玻璃效果

iOS高斯模糊&毛玻璃效果

作者: 上北以北 | 来源:发表于2017-08-18 00:41 被阅读256次

    高斯模糊

    需要引入<Accelerate/Accelerate.h>类,一般封装到image的分类中,以便使用,下面是代码,其中blur为模糊程度

    #import <Accelerate/Accelerate.h>
    
    /**
     高斯模糊
     @param image image
     @param blur (0 - 1 之间)
     @return image
     */
    +(UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur
    {
        if (blur < 0.f || blur > 1.f) {
            blur = 0.5f;
        }
        
        int boxSize     = (int)(blur * 100); //100为最大模糊程度
        boxSize         = boxSize - (boxSize % 2) + 1;
        CGImageRef img  = image.CGImage;
        
        vImage_Buffer     inBuffer, outBuffer;
        vImage_Error      error;
        
        //从CGImage中获取数据
        CGDataProviderRef inProvider = CGImageGetDataProvider(img);
        CFDataRef inBitmapData       = CGDataProviderCopyData(inProvider);
        
        //设置从CGImage获取对象的属性
        void *pixelBuffer;
        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)
            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];
        
        //清除;
        CGContextRelease(ctx);
        CGColorSpaceRelease(colorSpace);
        free(pixelBuffer);
        CFRelease(inBitmapData);
        CGImageRelease(imageRef);
        
        return returnImage;
    }
    

    &毛玻璃效果

    毛玻璃效果实现有很多种,大致都是用蒙版的方式实现如toolbar去做蒙版,但是由于toolbar的表现不太好,在对接的地方会出现白边,所以我用iOS8出现的模糊处理类去做蒙版

        //需要做模糊效果的图片
        UIImageView *testView = [[UIImageView alloc]initWithFrame:self.view.bounds];
        [self.view addSubview:testView];
    
        //实现模糊效果
        UIBlurEffect *blurEffrct =[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
        
        //毛玻璃视图
        UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc]initWithEffect:blurEffrct];
        
        visualEffectView.frame = self.view.bounds;
    
        //设置透明度
        visualEffectView.alpha = 0.9;
        
        [self.view addSubview:visualEffectView];
    

    切记testView和蒙版的顺序不要放反了

    相关文章

      网友评论

        本文标题:iOS高斯模糊&毛玻璃效果

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