你的位置:首页 > 操作系统

[操作系统]iOS学习笔记2


今天博主有一个虚化,模糊效果的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步.

 模糊效果,顾名思义,是将你的背景图片进行虚化,模糊,进而在背景图片上增加一些不虚化,不模糊的button等等,从而达到一种吸引用户眼球的效果,通常称之为焦点效应.开发过程中,产生模糊效果的方法很多,下面为大家简单进行介绍.

1.最简单的方法.

你去找你的UI,设计一张毛玻璃效果的图片,贴上去,大功告成,模糊效果产生了.简单,易用.但是如果你想学习更多的知识,想通过代码的方式产生模糊效果,我们继续.

2.CoreImage.

coreImage是IOS5中新加入的一个Objective-c的框架,提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析。iOS提供了很多强大的滤镜(Filter),现在有127种之多,随着框架的更新,这一数字会继续增加。这些Filter提供了各种各样的效果,并且还可以通过滤镜链将各种效果的Filter叠加起来,形成强大的自定义效果,如果你对该效果很满意,还可以子类化滤镜。下面将代码贴在下面,与大家分享,如果对框架不熟悉,建议阅读苹果的官方API.

        CIContext *context = [CIContext contextWithOptions:nil];

        CIImage *inputImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"detail@2x.png"]];

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

        [filter setValue:inputImage forKey:kCIInputImageKey];

        [filter setValue:[NSNumber numberWithFloat:10.0] forKey:@"inputRadius"];

//        CIImage *result = [filter valueForKey:kCIOutputImageKey];

            CIImage *result=[filter outputImage];

        CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

        UIImage *image = [UIImage imageWithCGImage:cgImage];

        CGImageRelease(cgImage);

        self.imgView.image=image;

简单易用,推荐使用

 3.vImage

如果你对性能有极大的追求,那么vImage会适合你,iOS5.0中新增了vImage API可以使用,它属于Accelerate.Framework,所以如果你要使用它要在工程中加入这个Framework。模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数.

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

}

4.第三方库

可以在网上找到一些不错的第三方库,产生模糊效果.但是个人不推荐使用,断更永远是第三方库最大的诟病.