图片模糊效果

#import "UIImage+Blur.h"

#import <Accelerate/Accelerate.h>

@implementation UIImage (Blur)

//图片模糊方法

+ (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;

}


//模糊图片方法

+ (UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur{

    CIContext *context = [CIContext contextWithOptions:nil];

    CIImage *inputImage =[CIImage imageWithCGImage:image.CGImage];

    CIFilter *filter =[CIFilter filterWithName:@"CIGaussianBlur"];

    [filter setValue:inputImage forKey:kCIInputImageKey];

    [filter setValue:@(blur) forKey:@"inputRadius"];

    //模糊图片

    CIImage *result =[filter valueForKey:kCIOutputImageKey];

    CGImageRef outImage =[context createCGImage:result fromRect:[result extent]];

    UIImage *blurImage =[UIImage imageWithCGImage:outImage];

    CGImageRelease(outImage);

    return blurImage;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值