DSP

IOS进阶之Accelebrate.framework 实现图片模糊效果

2019-07-13 20:07发布


免责声明:本文章来源网络博客整理,仅供参考,欢迎讨论 Accelerate这个framework iOS 4.0引入了Accelerate框架(Accelerate.framework)。属于 Core OS层 该框架的接口可用于执行数学、大数字以及DSP运算。和开发者个人编写的库相比,该框架的优点在于它根据现存的各种iOS设备的硬件配置进行过优化。因此,您只需一次编码就可确保它在所有设备高效运行。 如需要进一步了解Accelerate框架,请查看Accelerate框架参考。 主要是用来做数字信号处理、图像处理相关的向量、矩阵运算的库。我们可以认为我们的图像都是由向量或者矩阵数据构成的,Accelerate里既然提供了高效的数学运算API,自然就能方便我们对图像做各种各样的处理。 基于vImage我们可以根据图像的处理原理直接做模糊效果,或者使用现有的工具。UIImage+ImageEffects是个很好的图像处理库,看名字也知道是对UIImage做的分类扩展。这个工具被广泛地使用着。 应用举例: 来自: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. }  
参考文章: http://blog.csdn.net/ios_che/article/details/12577131
http://www.cocoachina.com/ios/20141223/10731.html