kCICategoryBlur 模糊,好比高斯模糊、焦點模糊、運動模糊chrome
按使用場景分類:
kCICategoryStillImage 用於靜態圖像
kCICategoryVideo 用於視頻
kCICategoryInterlaced 用於交錯圖像
kCICategoryNonSquarePixels 用於非矩形像素
kCICategoryHighDynamicRange 用於HDR數組
1.實例CIImage -> 先把UIImage -> CGImageRef -> CIImage
2.建立CIFilter濾鏡並給濾鏡設置屬性(KVC)
3.建立CIContext上下文
4.初始化一個CGImageRef 輸出圖片對象 合併濾鏡輸出的圖像
5.賦給UIImage對象進行顯示
6.若是想使用濾鏡鏈 能夠再次添加效果框架
代碼示例:ide
#import "ViewController.h"//宏定義 屏幕的寬 #define SCREEN_WIDTH CGRectGetWidth([UIScreen mainScreen].bounds) //注意掛上代理 @interface ViewController () <UIImagePickerControllerDelegate,UINavigationControllerDelegate> { UIImageView *myImageView;//接收圖片的視圖 UIButton *photoButton;//從本地相冊選擇圖片的按鈕 UIButton *filterButton;//添加濾鏡的按鈕 UIButton *saveButton;//濾鏡後保存到本地相冊的按鈕 } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //去除導航欄的高度 self.edgesForExtendedLayout = UIRectEdgeNone; //設置背景色 self.view.backgroundColor = [UIColor greenColor]; // 建立按鈕 NSArray *titleButtonList = @[@"photo",@"Filter",@"save"]; for (int i=0; i<titleButtonList.count; i++) { UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(20+80*i, 20, 60, 40); [button setTitle:titleButtonList[i] forState:UIControlStateNormal]; button.tag = 10 +i ; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; button.backgroundColor = [UIColor cyanColor]; [self.view addSubview:button]; } // 初始化圖片視圖 myImageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, SCREEN_WIDTH-40, 300)]; myImageView.backgroundColor = [UIColor cyanColor]; [self.view addSubview:myImageView]; photoButton = [self.view viewWithTag:10]; filterButton = [self.view viewWithTag:11]; saveButton = [self.view viewWithTag:12]; // 給三個按鈕添加觸發事件 [photoButton addTarget:self action:@selector(photoAction:) forControlEvents:UIControlEventTouchUpInside]; // 濾鏡按鈕 [filterButton addTarget:self action:@selector(filterAction:) forControlEvents:UIControlEventTouchUpInside]; //保存濾鏡後圖片的按鈕 [saveButton addTarget:self action:@selector(saveAction:) forControlEvents:UIControlEventTouchUpInside]; } //選擇圖片 - (void)photoAction:(UIButton *)sender{ UIImagePickerController *pickerController = [[UIImagePickerController alloc]init]; pickerController.delegate = self; [self presentViewController:pickerController animated:YES completion:nil]; } //把圖片放在圖片視圖上 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ UIImage *image = info[UIImagePickerControllerOriginalImage]; myImageView.image = image; [self dismissViewControllerAnimated:YES completion:nil]; } //濾鏡按鈕的觸發方法 - (void)filterAction:(UIButton *)sender{ // 1.源圖 CIImage *inputImage = [CIImage imageWithCGImage:myImageView.image.CGImage]; // 2.濾鏡 CIFilter *filter = [CIFilter filterWithName:@"CIColorMonochrome"]; // NSLog(@"%@",[CIFilter filterNamesInCategory:kCICategoryColorEffect]);//注意此處兩個輸出語句的重要做用 NSLog(@"%@",filter.attributes); [filter setValue:inputImage forKey:kCIInputImageKey]; [filter setValue:[CIColor colorWithRed:1.000 green:0.165 blue:0.176 alpha:1.000] forKey:kCIInputColorKey]; CIImage *outImage = filter.outputImage; [self addFilterLinkerWithImage:outImage]; } //再次添加濾鏡 造成濾鏡鏈 - (void)addFilterLinkerWithImage:(CIImage *)image{ CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"]; [filter setValue:image forKey:kCIInputImageKey]; [filter setValue:@(0.5) forKey:kCIInputIntensityKey]; // 在這裏建立上下文 把濾鏡和圖片進行合併 CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef resultImage = [context createCGImage:filter.outputImage fromRect:filter.outputImage.extent]; myImageView.image = [UIImage imageWithCGImage:resultImage]; } //保存濾鏡後的圖片到本地相冊 - (void)saveAction:(UIButton *)sender{ UIImageWriteToSavedPhotosAlbum(myImageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } //保存成功調用的方法 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ NSLog(@"保存成功"); } @end
這也給了iOS新的圖像濾鏡,以致於我都等不及把它加到我本身的Nodality應用裏面了。這同時也也意味着代碼和功能能夠在類和設備上分享,我已經在設想一個Nodality的桌面版本了。post
那麼,這些新濾鏡是神馬玩意? 這麼說吧,CIFilter這個類裏有類方法filterNamesInCategories(),用來返回一個包含全部可用濾鏡的數組。下面快速瀏覽一下iOS8和9之間的差別吧:性能
CIAreaAverage - 返回一個單像素圖像,其中包含一塊顏色區內的平均顏色。學習
CIAreaMaximum - 返回一個單像素圖像,其中包含一塊顏色區內最大的顏色成分。url
CIAreaMaximumAlpha - 返回一個單像素圖像,其中包含顏色區中最大透明度的顏色矢量。spa
CIAreaMinimum - 返回一個單像素圖像,其中包含顏色區中最小顏色成分。代理
CIAreaMinimumAlpha - 返回一個單像素圖像,其中包含顏色區內的最小透明度的顏色矢量。
CIBoxBlur - 在一個矩形內使得圖像模糊化。
CICircularWrap - 用一個透明的圓圈環繞圖像。
CICMYKHalftone - 建立一個顏色,使得源圖像呈半色調,在白色頁面中使用使用青色,品紅色,黃色和墨色。
CIColumnAverage - 返回一個高爲1像素的圖像,包含每一個掃描列的平均顏色。
CIComicEffect - 像漫畫書同樣勾勒(圖像)邊緣,並應用半色調效果。
CIConvolution7X7 - 用一個7x7旋轉矩陣來調整像素值。
CICrystallize - 經過聚集源像素的顏色值,建立多邊形色塊。
CIDepthOfField - 模擬一個場景深刻的效果。
CIDiscBlur - 在一個圓盤形狀內模糊化圖像。
CIDisplacementDistortion - 將第二圖像的灰度值應用到第一圖像。
CIDroste - 用相似M.C.埃舍爾繪圖方式遞歸地繪製圖像的一部分。
CIEdges - 用顏色顯示圖像的邊緣。
CIEdgeWork - 產生一個黑白風格的相似木塊切口的圖像。
CIGlassLozenge - 建立一個菱形濾鏡,並扭曲濾鏡位置的圖像。
CIHeightFieldFromMask - 產生一個連續的三維物體,一個閣樓形的灰場。
CIHexagonalPixellate - 用所替換的像素映射彩色六邊形的圖像。
CIKaleidoscope - 從源圖像中經過將12路對稱,產生一個五光十色的圖象。
CILenticularHaloGenerator - 模擬閃光燈效果。
CILineOverlay - 建立草圖,用黑色勾勒出圖像的邊緣。
CIMedianFilter - 計算一組鄰近像素的平均數,而後用平均數替代每一個像素的值。
CINoiseReduction - 經過下降噪聲的限定值來下降噪音。
CIOpTile - 先分割圖像,施加一些指定的縮放和旋轉,而後拼接圖像,造成的藝術化的表現。
CIPageCurlTransition - 使用翻頁效果從一個圖像轉換到另外一個圖像,翻卷後顯示新的圖像。
CIPageCurlWithShadowTransition - 使用翻頁效果從一個圖像轉換到另外一個圖像,翻卷後顯示新的圖像。
CIParallelogramTile - 展現一個在平行四邊形內的圖像。
CIPassThroughColor
CIPassThroughGeom
CIPDF417BarcodeGenerator
CIPointillize - 呈現一個pointillistic風格的源圖像。
CIRippleTransition - 圖像建立一個圓形波從中心點向外擴大,在波形裏顯示新圖像。
CIRowAverage - 返回1個像素高的圖像,其中包含每行掃描的平均顏色。
CIShadedMaterial - 從一個高度場產生一個陰影圖像。
CISpotColor - 用色點替換顏色範圍。
CISpotLight - 圖像使用一個方向聚光燈效果呈現。
CIStretchCrop - 圖像經過拉伸和或裁剪以適合目標尺寸。
CISunbeamsGenerator - 圖像呈現陽光照射的效果。
CITorusLensDistortion - 建立環形濾鏡,並扭曲透鏡位置的圖像。
CITriangleTile - 截取圖像的一個三角形部分映射到一個三角形區域,而後平鋪展現。