標籤:
App設計時往往會用到一些模糊效果。iOS目前已提供一些模糊API可以讓我們方便是使用。一種是使用Core Image,另一種是使用Accelerate.Framework中的vImage API。
使用Core Image進行模糊
Core Image很早在Mac系統中得到應用,後來這個Framework也開始應用到iOS,不過直到iOS6.0才開始支援模糊。這個API調用起來很方便簡潔。
[cpp] view plaincopy
- - (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 plaincopy
- - (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;
- }
iOS高斯模糊處理