zoukankan      html  css  js  c++  java
  • iOS高斯模糊处理

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

    使用Core Image进行模糊

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

    [cpp] view plaincopy
     
    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 plaincopy
     
    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. }  
     
  • 相关阅读:
    9. MySQL
    python第四课
    python第三课pycharm的使用
    python第二课
    python第一课
    Python3基础-网络编程(8)
    Python3基础-异常处理(7)
    Python3基础-面向对象(6)
    Python3基础-模块和包(5)
    Python3基础-文件处理(4)
  • 原文地址:https://www.cnblogs.com/BinZone/p/4462354.html
Copyright © 2011-2022 走看看