您的位置:首页 > 移动开发 > IOS开发

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

2016-06-20 10:24 633 查看
免责声明:本文章来源网络博客整理,仅供参考,欢迎讨论

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

- (UIImage *)blurryImage:(UIImage *)image   

           withBlurLevel:(CGFloat)blur {  

    CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];  

    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"  

                         keysAndValues:kCIInputImageKey, inputImage,  

                                       @"inputRadius", @(blur),   

                                       nil];  

       

    CIImage *outputImage = filter.outputImage;  

       

    CGImageRef outImage = [self.context createCGImage:outputImage   

                                   fromRect:[outputImage extent]];  

    return [UIImage imageWithCGImage:outImage];  

}  


使用vImage API进行模糊

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

[cpp] view
plain copy

- (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {  

    if (blur < 0.f || blur > 1.f) {  

        blur = 0.5f;  

    }  

    int boxSize = (int)(blur * 100);  

    boxSize = boxSize - (boxSize % 2) + 1;  

       

    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));  

       

    if(pixelBuffer == NULL)  

        NSLog(@"No pixelbuffer");  

       

    outBuffer.data = pixelBuffer;  

    outBuffer.width = CGImageGetWidth(img);  

    outBuffer.height = CGImageGetHeight(img);  

    outBuffer.rowBytes = CGImageGetBytesPerRow(img);  

       

    error = vImageBoxConvolve_ARGB8888(&inBuffer,   

                                       &outBuffer,   

                                       NULL,   

                                       0,   

                                       0,   

                                       boxSize,   

                                       boxSize,   

                                       NULL,   

                                       kvImageEdgeExtend);  

       

       

    if (error) {  

        NSLog(@"error from convolution %ld", error);  

    }  

       

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  

    CGContextRef ctx = CGBitmapContextCreate(  

                                    outBuffer.data,  

                                    outBuffer.width,  

                                    outBuffer.height,  

                                    8,  

                                    outBuffer.rowBytes,  

                                    colorSpace,  

                                    kCGImageAlphaNoneSkipLast);  

    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);  

    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];  

       

    //clean up  

    CGContextRelease(ctx);  

    CGColorSpaceRelease(colorSpace);  

       

    free(pixelBuffer);  

    CFRelease(inBitmapData);  

       

    CGColorSpaceRelease(colorSpace);  

    CGImageRelease(imageRef);  

       

    return returnImage;  

}  

参考文章:

http://blog.csdn.net/ios_che/article/details/12577131


http://www.cocoachina.com/ios/20141223/10731.html


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: