亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發之圖片模糊效果的五種實現代碼

2020-07-26 02:50:48
字體:
來源:轉載
供稿:網友

前言

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

正文

下面就按照這五種方式,將其實現模糊效果的具體實現一一講解一下:

在iOS 7之前系統的類提供UIToolbar來實現毛玻璃效果:

- (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之后蘋果新增加了一個類UIVisualEffectView,通過這個類來實現毛玻璃效果:

- (void)uivisualEffectViewStyle{ /* NS_ENUM_AVAILABLE_IOS(8_0)  * UIBlurEffectStyleExtraLight,//額外亮度,(高亮風格)  * UIBlurEffectStyleLight,//亮風格  * UIBlurEffectStyleDark,//暗風格  * 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  */ //實現模糊效果 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之后就出現了Core Image的API,Core Image的API被放在CoreImage.framework庫中, 在iOS和OS X平臺上,Core Image都提供了大量的濾鏡(Filter),在OS X上有120多種Filter,而在iOS上也有90多,Core Image設置模糊之后會在周圍產生白邊:

- (UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur{ 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;}

GPUImage的開源庫實現毛玻璃效果:

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

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

- (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;}

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

demo下載地址:blurImage_jb51.rar

結語

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

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

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

 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品免费久久久久| 精品高清美女精品国产区| 日韩最新av在线| 亚洲午夜激情免费视频| 成人h片在线播放免费网站| 黄色成人av在线| 一区二区三区在线播放欧美| 国产精品成人一区二区| 亚洲第一区中文99精品| 色偷偷偷亚洲综合网另类| 久久久999精品免费| 亚洲人永久免费| 亚洲欧美日韩中文在线| 91麻豆国产语对白在线观看| 国产亚洲精品久久久久久牛牛| 亚洲欧美综合区自拍另类| 亚洲精品日韩激情在线电影| 性色av一区二区三区免费| 国产精品扒开腿做爽爽爽视频| 久久中文字幕一区| 欧美电影在线观看网站| 中文字幕日韩av电影| 热久久视久久精品18亚洲精品| 亚洲深夜福利在线| 日韩欧美高清视频| 亚洲人在线视频| 一本色道久久综合狠狠躁篇怎么玩| 精品亚洲永久免费精品| 日韩在线视频免费观看高清中文| 国内精品视频久久| 欧美精品制服第一页| 欧洲午夜精品久久久| 日韩视频在线免费观看| 欧美精品激情视频| 久久久久久久久久国产| 亚州成人av在线| 777精品视频| 国内精品久久久久久中文字幕| 亚洲国产精品高清久久久| 国产成人精品999| 91精品久久久久久| 久久天天躁狠狠躁老女人| 日韩欧美成人免费视频| 国产精品直播网红| 欧美成aaa人片免费看| 中文字幕欧美在线| 在线播放亚洲激情| 亚洲欧美在线免费观看| 国产精品电影网| 69av视频在线播放| 亚洲国产精品网站| 久久97精品久久久久久久不卡| 久久久国产91| 亚洲毛片一区二区| 亚洲影院高清在线| 国产一区二区欧美日韩| 国产精品老女人精品视频| 中文字幕日韩在线观看| 国产精品福利在线观看| 欧美久久久精品| 欧美成年人在线观看| 毛片精品免费在线观看| 久热精品视频在线观看| 久久人人爽人人爽人人片av高清| 国产深夜精品福利| 亚洲free性xxxx护士白浆| 亚洲激情在线视频| 久久99视频免费| 亚洲激情视频网站| 亚洲精品v欧美精品v日韩精品| 超碰97人人做人人爱少妇| 成人在线小视频| 国产成人精品视频在线观看| 色一情一乱一区二区| 久久影视免费观看| 欧美性高潮床叫视频| 国产精品久久电影观看| 国产女人18毛片水18精品| 亚洲女人天堂av| 亚洲精品98久久久久久中文字幕| 久久精品免费播放| 麻豆乱码国产一区二区三区| 欧美综合第一页| 国产日韩欧美在线视频观看| 国产精品高潮呻吟久久av无限| 国产亚洲aⅴaaaaaa毛片| 疯狂做受xxxx欧美肥白少妇| 成人a在线视频| 国产一区二区三区高清在线观看| 亚洲片国产一区一级在线观看| 日韩精品极品在线观看| 日韩精品在线免费播放| 日韩日本欧美亚洲| 国产精品福利网站| 色综合久久88色综合天天看泰| 成人黄色生活片| 亚洲福利在线播放| 午夜精品久久久久久99热| 97av在线视频| 久久久久久久久亚洲| 麻豆国产精品va在线观看不卡| 欧美老肥婆性猛交视频| 久久久精品国产一区二区| 欧美xxxx18国产| 色偷偷综合社区| 国产欧美中文字幕| 欧美亚洲在线观看| 久久亚洲精品国产亚洲老地址| 91精品久久久久久久久青青| 亚洲人成伊人成综合网久久久| 国产成人91久久精品| 美女久久久久久久久久久| 成人中心免费视频| 国产精品扒开腿做爽爽爽视频| 国产精品伦子伦免费视频| 69av在线播放| 自拍偷拍免费精品| 国产在线精品成人一区二区三区| 国产精品大片wwwwww| 欧美一级成年大片在线观看| 国产亚洲综合久久| 性欧美在线看片a免费观看| 91免费观看网站| 中文字幕v亚洲ⅴv天堂| 激情亚洲一区二区三区四区| 亚洲乱码国产乱码精品精天堂| 欧美另类xxx| 欧美超级免费视 在线| 日韩美女写真福利在线观看| 国产99视频在线观看| 国产精品网站视频| 亚洲伊人一本大道中文字幕| 45www国产精品网站| 欧美激情手机在线视频| 久久99精品久久久久久琪琪| 亚洲国产精品电影在线观看| 欧美成人合集magnet| 国产精品福利在线观看| 成人福利网站在线观看| 国产精品久久久久99| 日韩精品亚洲视频| 成人国产精品一区二区| 亚洲综合自拍一区| 亚洲男人的天堂网站| 国产精品一区二区3区| 国产精品一香蕉国产线看观看| 久久99热精品这里久久精品| 国产精品偷伦视频免费观看国产| 久久天天躁狠狠躁夜夜av| 国产精品成久久久久三级| 久久久久久亚洲精品中文字幕| 国模私拍一区二区三区| 黑人狂躁日本妞一区二区三区| 国产精品美女久久久久av超清| 亚洲人成网在线播放| 亚洲香蕉成视频在线观看| 亚洲人成自拍网站| 国产精品网站视频| 欧美日韩激情网| 91精品免费视频| 亚洲欧美日本精品| 91牛牛免费视频| 深夜精品寂寞黄网站在线观看| 久久视频在线直播|