如果你還不了解
CoreImage
濾鏡的話請移步上一遍文章多彩的圖片(1) -- Core Image 濾鏡
我們這次的Demo使用CICrystallize
和CIGaussianBlur
兩個濾鏡來演示如何實現(xiàn)濾鏡鏈没隘。
那你可能要問了出吹,什么是濾鏡鏈呢照藻?雖然蘋果官方為我們提供了一百八十多種濾鏡龄恋,但是要想得到一張絢麗的圖片焙畔,往往單靠一個濾鏡很難實現(xiàn),需要至少兩個以上的濾鏡效果疊加才可以开皿。在第一個濾鏡效果設(shè)置好后忱屑,不進行渲染,直接創(chuàng)建第二個濾鏡效果壳坪,直至最終達到效果后舶得,再進行圖像渲染,這就是所謂的濾鏡鏈爽蝴。我們來看如下代碼:
UIImage *demoImg = [UIImage imageNamed:@"HS"];
// 1. 利用UIImage對象沐批,創(chuàng)建一個CIImage
CIImage *ciImage = [[CIImage alloc] initWithImage:demoImg];
// 2. 創(chuàng)建第一個CIFilter(濾鏡)
CIFilter *ciFilterOne = [CIFilter filterWithName:@"CICrystallize"];
[ciFilterOne setValue:ciImage forKey:kCIInputImageKey];
[ciFilterOne setDefaults];
// 對第一個濾鏡設(shè)置參數(shù)
[ciFilterOne setValue:[CIVector vectorWithX:200 Y:200] forKey:kCIInputCenterKey];
[ciFilterOne setValue:@(50) forKey:kCIInputRadiusKey];
// 創(chuàng)建第二個濾鏡
CIFilter *ciFilterTwo = [CIFilter filterWithName:@"CIGaussianBlur"];
// 利用第一個濾鏡 ciFilterOne.outputImage 來創(chuàng)建第二個濾鏡
[ciFilterTwo setValue:ciFilterOne.outputImage forKey:kCIInputImageKey];
[ciFilterTwo setDefaults];
[ciFilterTwo setValue:@(20) forKey:kCIInputRadiusKey];
// 3. 創(chuàng)建繪制上下文CIContext 這里默認CPU渲染
CIContext *ciContext = [[CIContext alloc] initWithOptions:nil];
// 創(chuàng)建CGImage句柄
CGImageRef cgImage = [ciContext createCGImage:[ciFilterTwo outputImage] fromRect:[[ciFilterTwo outputImage] extent]];
UIImageView *demoImgView = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage:cgImage]];
demoImgView.frame = CGRectMake(20, 90, 365, 210);
[self.view addSubview:demoImgView];
// 釋放句柄
CGImageRelease(cgImage);
如代碼所示,在創(chuàng)建了第一個濾鏡ciFilterOne
后霜瘪,直接使用outputImage
獲取到添加了濾鏡的CIImage
對象創(chuàng)建第二個濾鏡。
本案例與上一篇文章:多彩的圖片(1) -- Core Image 濾鏡的案例都使用的是CPU
渲染惧磺,相對GPU
渲染會慢一些颖对,渲染內(nèi)容過多的話會造成手機卡頓。在這種情況下磨隘,我們會選擇使用GPU
渲染缤底,速度更快顾患。下一篇文章會介紹如何使用Core Image
進行GPU
渲染。