美文网首页程序员iOS Developer
【code_小马】图片加模糊(高斯模糊)

【code_小马】图片加模糊(高斯模糊)

作者: 曾经像素有点低 | 来源:发表于2017-01-01 00:23 被阅读1180次
    我们是工程师 ——加油 !
    • 此文章所举出两种方法的工具类以及Demo链接 :

    https://github.com/McodeYG/iOSGaussianBlur
    • 老规矩先上代码,拿去复制粘贴吧。

    1. CoreImage 实现高斯模糊效果

    
    -(UIImage *)getBlurImageWithImage:(UIImage *)theImage blurDegree:(CGFloat)blerDegree
    {
        
        CIContext *context = [CIContext contextWithOptions:nil];
        CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage];
        CIFilter *affineClampFilter = [CIFilter filterWithName:@"CIAffineClamp"];
        CGAffineTransform xform = CGAffineTransformMakeScale(1.0, 1.0);
        [affineClampFilter setValue:inputImage forKey:kCIInputImageKey];
        [affineClampFilter setValue:[NSValue valueWithBytes:&xform
                                                   objCType:@encode(CGAffineTransform)]
                             forKey:@"inputTransform"];
        
        CIImage *extendedImage = [affineClampFilter valueForKey:kCIOutputImageKey];
        CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
        [blurFilter setValue:extendedImage forKey:kCIInputImageKey];
        [blurFilter setValue:[NSNumber numberWithFloat:blerDegree] forKey:@"inputRadius"];
        CIImage *result = [blurFilter valueForKey:kCIOutputImageKey];
        CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];
        UIImage *returnImage = [UIImage imageWithCGImage:cgImage];
        CGImageRelease(cgImage);
        
        return returnImage;
    }
    
    

    CoreImage的调用方法

    YG_core_image.image = [self coreBlurImage:[UIImage imageNamed:@"code_xiaoma.png"] withBlurNumber:2.0];
    

    效果图


    【code_小马】效果图.png

    2.vImage API 实现高斯模糊效果

    1.常用的方法还有一个vImage
    但是此方法属于Accelerate.Framework,需要导入 Accelerate下的 Accelerate头文件。
    这个一般都会,下边的详细步骤图片请直接无视就好

    添加框架.png 选择框架添加.png 尖括号引入头文件.png

    2.Accelerate主要是用来做数字信号处理、图像处理相关的向量、矩阵运算的库。图像可以认为是由向量或者矩阵数据构成的(Accelerate里提供了高效的数学运算API,能方便我们对图像做各种各样的处理 ),模糊算法使用的是vImageBoxConvolve_ARGB8888函数。

    
    // vImage API
    -(UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur
    {
        if (blur < 0.f || blur > 1.f) {
            blur = 0.5f;
        }
        int boxSize = (int)(blur * 40);
        boxSize = boxSize - (boxSize % 2) + 1;
        CGImageRef img = image.CGImage;
        vImage_Buffer inBuffer, outBuffer;
        vImage_Error error;
        void *pixelBuffer;
        //从CGImage中获取数据
        CGDataProviderRef inProvider = CGImageGetDataProvider(img);
        CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
        //设置从CGImage获取对象的属性
        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;
    }
    
    

    方法2的调用方法在这

    YG_v_image.image = [self coreBlurImage:[UIImage imageNamed:@"code_xiaoma.png"] withBlurNumber:3.0];
    

    以上两个方法是我经常使用的方法,网上还有一些方法,例如iOS8.0之后还有使用核心代码的方法,我在这里就不一一枚举了。
    有兴趣的同学可以看一下这个帖子:http://www.jb51.net/article/78113.htm




    【code_小马】iOS实用战术

    🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

    🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
    🌹晌午时光🌹
    🌹很喜欢的一篇文章,拿出来和大家分享🌹
    🌹【第五集】🌹
    🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

    .................后来我想,那时奶奶和如风可能有了些所谓意念上的交流,而奶奶在临终前读懂了他的意思,也预见到了我们的未来。  办完奶奶的丧事,我从未感觉到的生活压力,活灵活现的摆在了我面前。以前只是穷,没有好的享受,但可以吃饱穿暖,13平的小卖店加上奶奶零星替别人做的杂活还能让我和弟弟无忧无虑的长大。但奶奶去世后,小卖店没人照看已经不能开张了,我和如风混混沌沌的坐吃山空了几个月,终于到了弹尽粮绝的时候。我们没有钱,家里的存货已经被吃光了,我望着空空如也的货架第一次感觉饿肚子的难受。  “阿风,我要去找个活。”我收拾了些东西推门走了出去,如风紧跟着我出了门。  我盲目的在巷子里转,没有地方要我这样的零工。天黑透的时候下起了雨,各家小店都打了烊,我一无所获。我觉得很无助,一天都没有吃东西,很饿,淋着雨,浑身都湿透了。我想起奶奶,我想我大概也快死了。如风始终不说话,默默跟在我后面。  “别跟着我了!”我扭身冲他喊,“跟着也没用,我找不到工作,我们要饿死了,我们怎么办?你说我们怎么办?……”  我语无伦次了,我真的不知道该怎么办,眼泪像决堤一样混着雨水倾盆而下。  如风猛地抓住我的双肩,斩钉截铁地说:“姐,我不念书了。明天我去找事做!我绝不会让你饿死!”  我一边哽咽,一边惊讶的望着他   不知道从什么时候开始,如风已经高过我半头了,原来瘦瘦小小的他竟然变的很强壮。还有,他的唇边长出了毛茸茸的胡子,而我也鼓出了小小的胸脯。我们都长大了,从男孩子与女孩子向男人与女人跨进。命运不由选择,时间不能重置,现在的我们即使没有了奶奶,也要独立的活下去。  如风的手臂很用力,我的肩膀在他手里显得格外单薄,他眼神坚定的看着我,我张张嘴却没能说出什么。在现实面前我比他软弱很多。  回家的路上,如风走在我旁边,我感觉不是那么的饿了,也不哭了。我想,那个在巷子里快乐嬉戏的小女孩终究不可避免的成为了过去。如风也不再是默默无闻的恳求在我身边的小男孩了。  突然间感觉,我们虽然走在同一条路上,但未来已经不知不觉的把我们分开了一点点。至少,他已经从我身后走到了我身边。    那年,我15岁,魏如风14岁。    十七岁是雨季,不知道别人的雨季会不会下我这么大的雨,电闪雷鸣,铺天盖地,一下就是一辈子……

    文章第六集

    文章第四集

    后续更新中,喜欢的话 请点关注 🌹【code_小马】🌹 哦

    相关文章

      网友评论

        本文标题:【code_小马】图片加模糊(高斯模糊)

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