iOS開發-圖片高斯模糊效果

來源:互聯網
上載者:User

標籤:問題   bit   htm   padding   下拉   pix   clean up   graph   效果   

http://www.cnblogs.com/xiaofeixiang/p/5129074.html

 

iOS開發的時候有的時候需要將圖片設定模糊,或者通過點擊下拉方法,去除模糊,一切都是為了應用更受使用者歡迎,iOS7之後半透明模糊效果得到大範圍使用的比較大,現在也可以看到很多應用局部用到了圖片模糊效果,關於圖片實現高斯模糊效果有三種方式,CoreImage,GPUImage(第三方開源類庫)和vImage。GPUImage沒怎麼用過,本文就講兩種方式Core Image和vImage。

Core  Image

開始擼代碼之前我們先來看一下實現的效果:

iOS5.0之後就出現了Core Image的API,Core Image的API被放在CoreImage.framework庫中,在iOS和OS X平台上,Core Image都提供了大量的濾鏡(Filter),在OS X上有120多種Filter,而在iOS上也有90多。首先我們擴充一下UIImage,添加類方法:

12345678910111213141516 +(UIImage *)coreBlurImage:(UIImage *)image           withBlurNumber:(CGFloat)blur {    //部落格園-FlyElephant    CIContext *context = [CIContext contextWithOptions:nil];    CIImage  *inputImage=[CIImage imageWithCGImage:image.CGImage];    //設定filter    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];    [filter setValue:inputImage forKey:kCIInputImageKey];    [filter setValue:@(blur) forKey: @"inputRadius"];    //模糊圖片    CIImage *result=[filter valueForKey:kCIOutputImageKey];    CGImageRef outImage=[context createCGImage:result fromRect:[result extent]];    UIImage *blurImage=[UIImage imageWithCGImage:outImage];    CGImageRelease(outImage);    return blurImage;}

其中過濾的選項設定為高斯模糊:

  

vImage 方式

vImage屬於Accelerate.Framework,需要匯入Accelerate下的Accelerate標頭檔,Accelerate主要是用來做數字訊號處理、影像處理相關的向量、矩陣運算的庫。映像可以認為是由向量或者矩陣資料構成的,Accelerate裡既然提供了高效的數學運算API,自然就能方便我們對映像做各種各樣的處理,模糊演算法使用的是vImageBoxConvolve_ARGB8888這個函數。 

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 +(UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur {    if (blur < 0.f || blur > 1.f) {        blur = 0.5f;    }    int boxSize = (int)(blur * 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;}

圖片模糊調用:

12345 self.imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 300, SCREENWIDTH, 100)];self.imageView.contentMode=UIViewContentModeScaleAspectFill;self.imageView.image=[UIImage boxblurImage:self.image withBlurNumber:0.5];self.imageView.clipsToBounds=YES;[self.view addSubview:self.imageView];

關於兩種方式的選擇的建議

效果:第一種Core Image設定模糊之後會在周圍產生白邊,vImage使用不存在任何問題;

效能:映像模糊處理屬於複雜的計算,大部分圖片模糊選擇的是vImage,效能最佳(沒有親自測試過,有興趣可以自己測試)

項目地址:https://github.com/SmallElephant/iOS-UIImageBoxBlur

參考資料:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur

 

iOS開發-圖片高斯模糊效果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.