今天博主有一個虛化,模糊效果的需求,遇到了一些困難點,在此和大家分享,希望能夠共同進步.
模糊效果,顧名思義,是將你的背景圖片進行虛化,模糊,進而在背景圖片上增加一些不虛化,不模糊的button等等,從而達到一種吸引用戶眼球的效果,通常稱之為焦點效應.開發過程中,產生模糊效果的方法很多,下面為大家簡單進行介紹.
1.最簡單的方法.
你去找你的UI,設計一張毛玻璃效果的圖片,貼上去,大功告成,模糊效果產生了.簡單,易用.但是如果你想學習更多的知識,想通過代碼的方式產生模糊效果,我們繼續.
2.CoreImage.
coreImage是IOS5中新加入的一個Objective-c的框架,提供了強大高效的圖像處理功能,用來對基于像素的圖像進行操作與分析。iOS提供了很多強大的濾鏡(Filter),現在有127種之多,隨著框架的更新,這一數字會繼續增加。這些Filter提供了各種各樣的效果,并且還可以通過濾鏡鏈將各種效果的Filter疊加起來,形成強大的自定義效果,如果你對該效果很滿意,還可以子類化濾鏡。下面將代碼貼在下面,與大家分享,如果對框架不熟悉,建議閱讀蘋果的官方API.
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"[email protected]"]];
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:10.0] forKey:@"inputRadius"];
// CIImage *result = [filter valueForKey:kCIOutputImageKey];
CIImage *result=[filter outputImage];
CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
self.imgView.image=image;
簡單易用,推薦使用
3.vImage
如果你對性能有極大的追求,那么vImage會適合你,iOS5.0中新增了vImage API可以使用,它屬于Accelerate.Framework,所以如果你要使用它要在工程中加入這個Framework。模糊算法使用的是vImageBoxConvolve_ARGB8888這個函數.
- (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {
if (blur < 0.f || blur > 1.f) {
blur = 0.5f;
}
int boxSize = (int)(blur * 100);
boxSize = boxSize - (boxSize % 2) + 1;
CGImageRef img = image.CGImage;
vImage_Buffer inBuffer, outBuffer;
vImage_Error error;
void *pixelBuffer;
CGDataPRoviderRef inProvider = CGImageGetDataProvider(img);
CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
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;
}
4.第三方庫
可以在網上找到一些不錯的第三方庫,產生模糊效果.但是個人不推薦使用,斷更永遠是第三方庫最大的詬病.
5.8.0新開放API
在評論區看到大神@ZweiZhao的代碼,發現開放了新的API,十分感謝.在這里加上注釋,與大家分享.
// 創建需要的毛玻璃特效類型
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
// 毛玻璃view 視圖
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
//添加到要有毛玻璃特效的控件中
effectView.frame = self.imageV.bounds;
[self.imageV addSubview:effectView];
//設置模糊透明度
effectView.alpha = .8f;
http://blog.sina.cn/dpool/blog/s/blog_92ac2c5b0101cm5b.html?plg_nld=1&plg_uin=1&plg_auth=1&vt=4&plg_usr=1&plg_nld=1&plg_vkey=1&plg_dev=1
http://www.companysz.com/kenshincui/p/3959951.html
新聞熱點
疑難解答