? ? ? ?第一是高斯模糊,iOS5.0之后出現(xiàn)了CoreImage的API镜沽,Core Image的API被放在CoreImage.framework庫中, 在iOS和OS X平臺上,Core Image都提供了大量的濾鏡(Filter)状婶,在OS X上有120多種Filter提前,而在iOS上也有90多。
? ? ? ?方法如下:
+ (UIImage *)coreTeachImage:(UIImage *)image withCoreNumber:(CGFloat)coreNumber {
CIContext *context = [CIContext contextWithOptions:nil];
CIImage? *inputImage=[CIImage imageWithCGImage:image.CGImage];
//設置filter
CGImageRef outImage;
if (NSFoundationVersionNumber >= 1140.11) {
CIImage *result = [inputImage imageByClampingToExtent];
result = [result imageByApplyingFilter:@"CIGaussianBlur" withInputParameters:@{
kCIInputRadiusKey : @(coreNumber)
}];
result = [result imageByCroppingToRect:inputImage.extent];
outImage=[context createCGImage:result fromRect:[result extent]];
}
UIImage *blurImage=[UIImage imageWithCGImage:outImage];
CGImageRelease(outImage);
return blurImage;
}
效果如下(coreNumber設置為5)
但是在實際項目開發(fā)里這種方法好像遇到了問題字逗。
第二種方法是用系統(tǒng)Accelerate.Framework,Accelerate主要是用來做數字信號處理宅广、圖像處理相關的向量葫掉、矩陣運算的庫。圖像可以認為是由向量或者矩陣數據構成的跟狱,Accelerate里既然提供了高效的數學運算API俭厚,自然就能方便我們對圖像做各種各樣的處理 ,模糊算法使用的是vImageBoxConvolve_ARGB8888這個函數驶臊。具體代碼如下:
+ (UIImage *)vagueImage:(UIImage *)image withVagueNumber:(CGFloat)number {
if (number < 0.f || number > 1.f) {
number = 0.5f;
}
int boxSize = (int)(number * 40);
boxSize = boxSize - (boxSize % 2) + 1;
CGImageRef img = image.CGImage;
vImage_Buffer inBuffer, outBuffer;
vImage_Error error;
void *pixelBuffer;
// 從CGImage中獲取數據
CGDataProviderRef inProvider = CGImageGetDataProvider(img);
CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
// 設置從CGImage獲取對象的屬性
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;
}
效果圖:(number設置0.4)
最后就是用的第三方:其中一個類UIImageView+LBBlurredImage关翎,項目開發(fā)中發(fā)現(xiàn)對大圖片加載會有些慢