美文网首页图片相关收藏
OC图片模糊效果(一)

OC图片模糊效果(一)

作者: 萤火驻守心间 | 来源:发表于2022-03-13 05:32 被阅读0次

引用IOS自带framework中的Accelerate


image.png

实现代码为:
image是图片,ratio是模糊度

  • (UIImage *)bufImage:(UIImage *)image withRatio:(CGFloat)ratio;
    {
    if (image == nil)
    {
    NSLog(@"image不能为空");
    return nil;
    }
    int bufSize = (int)(ratio * 100);
    bufSize -= (bufSize % 2) + 1;
    if (bufSize < 1) {
    bufSize = 1;
    }
    NSLog(@"bufSize:%i",bufSize);
    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));
    outBuffer.data = pixelBuffer;
    outBuffer.width = CGImageGetWidth(img);
    outBuffer.height = CGImageGetHeight(img);
    outBuffer.rowBytes = CGImageGetBytesPerRow(img);

    void *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
    vImage_Buffer outBuffer2;
    outBuffer2.data = pixelBuffer2;
    outBuffer2.width = CGImageGetWidth(img);
    outBuffer2.height = CGImageGetHeight(img);
    outBuffer2.rowBytes = CGImageGetBytesPerRow(img);

    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, bufSize, bufSize, NULL, kvImageEdgeExtend);
    error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, bufSize, bufSize, NULL, kvImageEdgeExtend);
    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, bufSize, bufSize, NULL, kvImageEdgeExtend);
    if (error) {
    NSLog(@"error from convolution %ld", error);
    }

    //颜色空间DeviceRGB
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(
    outBuffer.data,
    outBuffer.width,
    outBuffer.height,
    8,
    outBuffer.rowBytes,
    colorSpace,
    CGImageGetBitmapInfo(image.CGImage));

    //根据上下文,处理过的图片,重新组件
    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
    //释放
    CGContextRelease(ctx);
    CGColorSpaceRelease(colorSpace);
    free(pixelBuffer);
    free(pixelBuffer2);
    CFRelease(inBitmapData);
    CGImageRelease(imageRef);
    return returnImage;
    }

相关文章

网友评论

    本文标题:OC图片模糊效果(一)

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