【iOS】iOS下高斯模糊效果的实现

来源:互联网 发布:中国可备案的域名后缀 编辑:程序博客网 时间:2024/05/30 05:40

其实有很多种实现方式,但是没必要了解那么多,简单实用就行,选取一种性能相对来说比较好的方式
效果图如下(高斯0.1):
高斯0.1
代码:
需要导入

#import <Accelerate/Accelerate.h>

UIImage *image = [UIImage imageNamed:@"44.jpg"];
image = [self blurryImage:image withBlurLevel:0.1];

方法代码:

#pragma mark - 高斯- (UIImage *)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;}
1 0