免责声明:本文章来源网络博客整理,仅供参考,欢迎讨论
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];
-
-
-
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