毛玻璃效果实现



核心代码:

[cpp]  view plain copy
  1. //加模糊效果,image是图片,blur是模糊度  
  2. - (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {  
  3.     //模糊度,  
  4.     if ((blur < 0.1f) || (blur > 2.0f)) {  
  5.         blur = 0.5f;  
  6.     }  
  7.       
  8.     //boxSize必须大于0  
  9.     int boxSize = (int)(blur * 100);  
  10.     boxSize -= (boxSize % 2) + 1;  
  11.     NSLog(@"boxSize:%i",boxSize);  
  12.     //图像处理  
  13.     CGImageRef img = image.CGImage;  
  14.     //需要引入#import <Accelerate/Accelerate.h>  
  15.     /* 
  16.      This document describes the Accelerate Framework, which contains C APIs for vector and matrix math, digital signal processing, large number handling, and image processing. 
  17.      本文档介绍了Accelerate Framework,其中包含C语言应用程序接口(API)的向量和矩阵数学,数字信号处理,大量处理和图像处理。 
  18.      */  
  19.       
  20.     //图像缓存,输入缓存,输出缓存  
  21.     vImage_Buffer inBuffer, outBuffer;  
  22.     vImage_Error error;  
  23.     //像素缓存  
  24.     void *pixelBuffer;  
  25.       
  26.     //数据源提供者,Defines an opaque type that supplies Quartz with data.  
  27.     CGDataProviderRef inProvider = CGImageGetDataProvider(img);  
  28.     // provider’s data.  
  29.     CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);  
  30.       
  31.     //宽,高,字节/行,data  
  32.     inBuffer.width = CGImageGetWidth(img);  
  33.     inBuffer.height = CGImageGetHeight(img);  
  34.     inBuffer.rowBytes = CGImageGetBytesPerRow(img);  
  35.     inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);  
  36.       
  37.     //像数缓存,字节行*图片高  
  38.     pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));  
  39.       
  40.     outBuffer.data = pixelBuffer;  
  41.     outBuffer.width = CGImageGetWidth(img);  
  42.     outBuffer.height = CGImageGetHeight(img);  
  43.     outBuffer.rowBytes = CGImageGetBytesPerRow(img);  
  44.       
  45.       
  46.     // 第三个中间的缓存区,抗锯齿的效果  
  47.     void *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));  
  48.     vImage_Buffer outBuffer2;  
  49.     outBuffer2.data = pixelBuffer2;  
  50.     outBuffer2.width = CGImageGetWidth(img);  
  51.     outBuffer2.height = CGImageGetHeight(img);  
  52.     outBuffer2.rowBytes = CGImageGetBytesPerRow(img);  
  53.       
  54.     //Convolves a region of interest within an ARGB8888 source image by an implicit M x N kernel that has the effect of a box filter.  
  55.     error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);  
  56.     error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);  
  57.     error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);  
  58.       
  59.       
  60.     if (error) {  
  61.         NSLog(@"error from convolution %ld", error);  
  62.     }  
  63.       
  64. //    NSLog(@"字节组成部分:%zu",CGImageGetBitsPerComponent(img));  
  65.     //颜色空间DeviceRGB  
  66.     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
  67.     //用图片创建上下文,CGImageGetBitsPerComponent(img),7,8  
  68.     CGContextRef ctx = CGBitmapContextCreate(  
  69.                                              outBuffer.data,  
  70.                                              outBuffer.width,  
  71.                                              outBuffer.height,  
  72.                                              8,  
  73.                                              outBuffer.rowBytes,  
  74.                                              colorSpace,  
  75.                                              CGImageGetBitmapInfo(image.CGImage));  
  76.       
  77.     //根据上下文,处理过的图片,重新组件  
  78.     CGImageRef imageRef = CGBitmapContextCreateImage (ctx);  
  79.     UIImage *returnImage = [UIImage imageWithCGImage:imageRef];  
  80.       
  81.     //clean up  
  82.     CGContextRelease(ctx);  
  83.     CGColorSpaceRelease(colorSpace);  
  84.       
  85.     free(pixelBuffer);  
  86.     free(pixelBuffer2);  
  87.     CFRelease(inBitmapData);  
  88.       
  89.     CGColorSpaceRelease(colorSpace);  
  90.     CGImageRelease(imageRef);  
  91.       
  92.     return returnImage;  
  93. }  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值