日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 毛玻璃效果的实现方法

發布時間:2025/7/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 毛玻璃效果的实现方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

iOS開發中有的時候需要將圖片設置模糊,來實現特定的效果獲取更好的用戶體驗, iOS7之后半透明模糊效果得到大范圍使用的比較大,現在也可以看到很多應用局部用到了圖片模糊效果,可以通過高斯模糊和毛玻璃效果達到圖片模糊效果。

左邊玻璃右邊模糊
高斯模糊效果

1.** CoreImage: **
iOS5.0之后就出現了Core Image的API,Core Image的API被放在CoreImage.framework庫中, 在iOS和OS X平臺上,Core Image都提供了大量的濾鏡(Filter),在OS X上有120多種Filter,而在iOS上也有90多。

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

2.** vImage **
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; }

方法調用

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

3.GPUImage
GPUImage是用設備的GPU來實時處理圖片,給圖片加各種濾鏡效果的一個開源庫。
可以實時地給照相機加上濾鏡效果,很多App都支持這種實時濾鏡。
鏈接地址:https://github.com/BradLarson/GPUImage

區別:
效果:第一種Core Image設置模糊之后會在周圍產生白邊,vImage使用不存在任何問題;
性能:圖像模糊處理屬于復雜的計算,大部分圖片模糊選擇的是vImage,性能最佳

項目地址: https://github.com/524429264/iOS-UIImageBoxBlur
參考資料:https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur

毛玻璃效果
  • 蘋果在iOS7.0之后,很多系統界面都使用了毛玻璃效果,增加了界面的美觀性,比如通知中心界面;其實在iOS7.0(包括)之前還是有系統的類可以實現毛玻璃效果的, 就是 UIToolbar這個類
    iOS7.0
    毛玻璃的樣式(枚舉)
    UIBarStyleDefault = 0,
    UIBarStyleBlack = 1,
    UIBarStyleBlackOpaque = 1, // Deprecated. Use UIBarStyleBlack
    UIBarStyleBlackTranslucent = 2, // Deprecated. Use UIBarStyleBlack and set the translucent property to YES
  • UIImageView *bgImgView = [[UIImageView alloc] initWithFrame:self.view.bounds];bgImgView.image = [UIImage imageNamed:@"huoying4.jpg"]; [self.view addSubview:bgImgView]; > UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, bgImgView.frame.size.width*0.5, bgImgView.frame.size.height)]; toolbar.barStyle = UIBarStyleBlackTranslucent; [bgImgView addSubview:toolbar];
  • 在iOS8.0之后,蘋果新增了一個類UIVisualEffectView,通過這個類來實現毛玻璃效果與上面的UIToolbar一樣,而且效率也非常之高,使用也是非常簡單,幾行代碼搞定. UIVisualEffectView是一個抽象類,不能直接使用,需通過它下面的三個子類來實現(UIBlurEffect, UIVisualEffevt, UIVisualEffectView);
  • 子類UIBlurEffect只有一個類方法,用來快速創建一個毛玻璃效果,參數是一個枚舉,用來設置毛玻璃的樣式,而UIVisualEffectView則多了兩個屬性和兩個構造方法,用來快速將創建的毛玻璃添加到這個UIVisualEffectView上.

    特別注意: 這個類是iOS8.0之后才適用, 所以如果項目要兼容iOS7.0的話, 還是要考慮其它的兩種方法了.

    ** 實現代碼:**

    同樣是先快速的實例化UIBlurEffect并設置毛玻璃的樣式,然后再通過UIVisualEffectView的構造方法將UIBlurEffect的實例添加上去, 最后設置frame或者是通過添加約束, 將effectView添加到要實現了毛玻璃的效果的view控件上,效果圖和上面的一樣.

    iOS8.0毛玻璃的樣式(枚舉)UIBlurEffectStyleExtraLight,UIBlurEffectStyleLight,UIBlurEffectStyleDark>UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]; UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; effectView.frame = CGRectMake(0, 0, bgImgView.frame.size.width*0.5, bgImgView.frame.size.height); [bgImgView addSubview:effectView];

    項目地址:https://github.com/524429264/EffectViewDemo

    轉載于:https://www.cnblogs.com/Free-Thinker/p/11347363.html

    總結

    以上是生活随笔為你收集整理的iOS 毛玻璃效果的实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。