iOS中的模糊效果

App设计时往往会用到一些模糊效果。iOS目前已提供一些模糊API可以让我们方便是使用。一种是使用Core Image,另一种是使用Accelerate.Framework中的vImage API。

使用Core Image进行模糊

Core Image很早在Mac系统中得到应用,后来这个Framework也开始应用到iOS,不过直到iOS6.0才开始支持模糊。这个API调用起来很方便简洁。

[cpp]  view plain copy
  1. - (UIImage *)blurryImage:(UIImage *)image   
  2.            withBlurLevel:(CGFloat)blur {  
  3.     CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];  
  4.     CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"  
  5.                          keysAndValues:kCIInputImageKey, inputImage,  
  6.                                        @"inputRadius", @(blur),   
  7.                                        nil];  
  8.        
  9.     CIImage *outputImage = filter.outputImage;  
  10.        
  11.     CGImageRef outImage = [self.context createCGImage:outputImage   
  12.                                    fromRect:[outputImage extent]];  
  13.     return [UIImage imageWithCGImage:outImage];  
  14. }  

使用vImage API进行模糊

iOS5.0中新增了vImage API可以使用,它属于Accelerate.Framework,所以如果你要使用它要在工程中加入这个Framework。模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数。

[cpp]  view plain copy
  1. - (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {  
  2.     if (blur < 0.f || blur > 1.f) {  
  3.         blur = 0.5f;  
  4.     }  
  5.     int boxSize = (int)(blur * 100);  
  6.     boxSize = boxSize - (boxSize % 2) + 1;  
  7.        
  8.     CGImageRef img = image.CGImage;  
  9.        
  10.     vImage_Buffer inBuffer, outBuffer;  
  11.     vImage_Error error;  
  12.        
  13.     void *pixelBuffer;  
  14.        
  15.     CGDataProviderRef inProvider = CGImageGetDataProvider(img);  
  16.     CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);  
  17.        
  18.     inBuffer.width = CGImageGetWidth(img);  
  19.     inBuffer.height = CGImageGetHeight(img);  
  20.     inBuffer.rowBytes = CGImageGetBytesPerRow(img);  
  21.        
  22.     inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);  
  23.        
  24.     pixelBuffer = malloc(CGImageGetBytesPerRow(img) *   
  25.                          CGImageGetHeight(img));  
  26.        
  27.     if(pixelBuffer == NULL)  
  28.         NSLog(@"No pixelbuffer");  
  29.        
  30.     outBuffer.data = pixelBuffer;  
  31.     outBuffer.width = CGImageGetWidth(img);  
  32.     outBuffer.height = CGImageGetHeight(img);  
  33.     outBuffer.rowBytes = CGImageGetBytesPerRow(img);  
  34.        
  35.     error = vImageBoxConvolve_ARGB8888(&inBuffer,   
  36.                                        &outBuffer,   
  37.                                        NULL,   
  38.                                        0,   
  39.                                        0,   
  40.                                        boxSize,   
  41.                                        boxSize,   
  42.                                        NULL,   
  43.                                        kvImageEdgeExtend);  
  44.        
  45.        
  46.     if (error) {  
  47.         NSLog(@"error from convolution %ld", error);  
  48.     }  
  49.        
  50.     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
  51.     CGContextRef ctx = CGBitmapContextCreate(  
  52.                                     outBuffer.data,  
  53.                                     outBuffer.width,  
  54.                                     outBuffer.height,  
  55.                                     8,  
  56.                                     outBuffer.rowBytes,  
  57.                                     colorSpace,  
  58.                                     kCGImageAlphaNoneSkipLast);  
  59.     CGImageRef imageRef = CGBitmapContextCreateImage (ctx);  
  60.     UIImage *returnImage = [UIImage imageWithCGImage:imageRef];  
  61.        
  62.     //clean up  
  63.     CGContextRelease(ctx);  
  64.     CGColorSpaceRelease(colorSpace);  
  65.        
  66.     free(pixelBuffer);  
  67.     CFRelease(inBitmapData);  
  68.        
  69.     CGColorSpaceRelease(colorSpace);  
  70.     CGImageRelease(imageRef);  
  71.        
  72.     return returnImage;  
  73. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值