国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS開發(fā)之圖片模糊效果的五種實(shí)現(xiàn)代碼

2019-10-21 18:46:56
字體:
供稿:網(wǎng)友

前言

在iOS開發(fā)中我們經(jīng)常會用到模糊效果使我們的界面更加美觀,而iOS本身也提供了幾種達(dá)到模糊效果的API,如:Core Image,使用Accelerate.Framework中的vImage API,在iOS 7之前系統(tǒng)的類提供UIToolbar,在iOS 8之后蘋果新增加的一個(gè)類UIVisualEffectView;另外也有一些牛人寫的第三方框架,如:GPUImage。本篇就針對這五種方式講解一下具體的實(shí)現(xiàn)。

ios模糊效果,ios開發(fā)模糊效果,ios圖片模糊效果

正文

下面就按照這五種方式,將其實(shí)現(xiàn)模糊效果的具體實(shí)現(xiàn)一一講解一下:

在iOS 7之前系統(tǒng)的類提供UIToolbar來實(shí)現(xiàn)毛玻璃效果:

- (void)toolbarStyle{ CGRect toolbarRect = CGRectMake(0, 0,ScreenW/2,ScreenH); UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:toolbarRect]; /*  * UIBarStyleDefault   = 0,  * UIBarStyleBlack   = 1,  * UIBarStyleBlackOpaque  = 1, // Deprecated. Use UIBarStyleBlack  * UIBarStyleBlackTranslucent = 2, // Deprecated. Use UIBarStyleBlack and set the translucent property to YES  */ toolbar.barStyle = UIBarStyleBlack; [self.myImageView addSubview:toolbar];}

在iOS 8之后蘋果新增加了一個(gè)類UIVisualEffectView,通過這個(gè)類來實(shí)現(xiàn)毛玻璃效果:

- (void)uivisualEffectViewStyle{ /* NS_ENUM_AVAILABLE_IOS(8_0)  * UIBlurEffectStyleExtraLight,//額外亮度,(高亮風(fēng)格)  * UIBlurEffectStyleLight,//亮風(fēng)格  * UIBlurEffectStyleDark,//暗風(fēng)格  * UIBlurEffectStyleExtraDark __TVOS_AVAILABLE(10_0) __IOS_PROHIBITED __WATCHOS_PROHIBITED,  * UIBlurEffectStyleRegular NS_ENUM_AVAILABLE_IOS(10_0), // Adapts to user interface style  * UIBlurEffectStyleProminent NS_ENUM_AVAILABLE_IOS(10_0), // Adapts to user interface style  */ //實(shí)現(xiàn)模糊效果 UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; //毛玻璃視圖 UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];; effectView.frame = CGRectMake(0, 0, ScreenW/2, ScreenH); [self.myImageView addSubview:effectView];}

iOS5.0之后就出現(xiàn)了Core Image的API,Core Image的API被放在CoreImage.framework庫中, 在iOS和OS X平臺上,Core Image都提供了大量的濾鏡(Filter),在OS X上有120多種Filter,而在iOS上也有90多,Core Image設(shè)置模糊之后會在周圍產(chǎn)生白邊:

- (UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur{ CIContext *context = [CIContext contextWithOptions:nil]; CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage]; //設(shè)置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;}

GPUImage的開源庫實(shí)現(xiàn)毛玻璃效果:

- (UIImage *)GPUImageStyleWithImage:(UIImage *)image{ GPUImageGaussianBlurFilter *filter = [[GPUImageGaussianBlurFilter alloc] init]; filter.blurRadiusInPixels = 10.0;//值越大,模糊度越大 UIImage *blurImage = [filter imageByFilteringImage:image]; return blurImage;}

vImage屬于Accelerate.Framework,需要導(dǎo)入 Accelerate下的 Accelerate頭文件, Accelerate主要是用來做數(shù)字信號處理、圖像處理相關(guān)的向量、矩陣運(yùn)算的庫。圖像可以認(rèn)為是由向量或者矩陣數(shù)據(jù)構(gòu)成的,Accelerate里既然提供了高效的數(shù)學(xué)運(yùn)算API,自然就能方便我們對圖像做各種各樣的處理 ,模糊算法使用的是vImageBoxConvolve_ARGB8888這個(gè)函數(shù):

- (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中獲取數(shù)據(jù) CGDataProviderRef inProvider = CGImageGetDataProvider(img); CFDataRef inBitmapData = CGDataProviderCopyData(inProvider); //設(shè)置從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;}

源碼已上傳至fenglinyunshi-git,并提出寶貴意見。

demo下載地址:blurImage.rar

結(jié)語

UIVisualEffectView技術(shù)是從iOS8之后引進(jìn)的,原理是在圖片上方生成一個(gè)蒙層,若最低適配iOS8的話可以考慮采取這個(gè),運(yùn)用UIBlurEffect是可逆的,我們可以去掉蒙層,顯示圖片;

[effectview removeFromSuperview];
  1. iOS 7之前系統(tǒng)的類提供的UIToolbar,原理也是在圖片上方生成一個(gè)蒙層。
  2. 利用CoreImage 進(jìn)行模糊處理,是非常消耗CPU性能的;
  3. GPUImage的開源庫實(shí)現(xiàn)毛玻璃效果也比較吃內(nèi)存,相對Core Image好一點(diǎn);
  4. 圖像模糊處理屬于復(fù)雜的計(jì)算,大部分圖片模糊選擇的是vImage,性能最佳。

UIToolbar和UIBlurEffect都是在圖片上方生成一個(gè)蒙層,都可以設(shè)置模糊的范圍;而其他三種方式都是對原來的圖片進(jìn)行模糊處理返回渲染后的一整張圖片,相對來說比較耗性能。圖1-2 是實(shí)測五種方式的內(nèi)存占用:

ios模糊效果,ios開發(fā)模糊效果,ios圖片模糊效果

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 祁连县| 建宁县| 苍梧县| 固阳县| 班玛县| 桦南县| 梅州市| 江达县| 长宁区| 江城| 澄江县| 淄博市| 昭平县| 资阳市| 南部县| 开鲁县| 安达市| 遵义县| 甘谷县| 左云县| 浏阳市| 柏乡县| 绿春县| 德昌县| 璧山县| 七台河市| 兰考县| 攀枝花市| 延寿县| 辰溪县| 雷波县| 云阳县| 灵璧县| 平湖市| 永嘉县| 西宁市| 兴文县| 凤山市| 资溪县| 郧西县| 郧西县|