iOS圖片編輯(CIFilter)

在iOS中開發過程中,如果你想對圖片進行簡單的處理,那麼很簡單,蘋果幫我們封裝了一套簡單易用的API——CIFilter。
使用CIFilter你可以做到:調節圖片亮度、對比度、飽和度等圖片基本的操作;使用模糊、銳化、高反差等對圖片進行濾鏡處理。

一、基本概念

1、CIFilterCategory

圖片處理的方式方法種類繁多,在CIFiler中是如何對這麼多的圖片處理方式進行歸類的呢?蘋果採用的是Category的形式。比如上文提到的圖片亮度、對比度、飽和度等顏色處理都屬於CICategoryColorAdjustment,圖片模糊處理對應CICategoryBlur,圖片銳化則對應CICategorySharpen。

2.CIFilterName

在圖片處理中,除了大的種類劃分之外,每一種類還有對應的不同處理方式,比如CICategoryBlur可以分爲CIBoxblur、CIDiscblur、
CIGaussianBlur、CIMotionBlur、CIZoomBlur等。

3.attributes

要想對圖片進行某一種處理,必須要調節對應屬性的屬性值,對於CIFilter來講也就是filter對象的attributes。每一個CIFiler對象都包含attributes屬性,並且其中相應的值在一定的區間內是可變動的,以此來作爲圖片對應屬性處理的參數。

4.inputImage && outputImage

使用CIFilter對圖片進行處理,CIFliter對象相當於設置了一系列參數的過濾器,將原始圖片輸入,輸出使用相應參數處理後的圖片。

二、使用CIFiler

1.準備工作

如果你使用較早版本的xcode,你可能需要導入一個動態庫framework
在xcode7等新版本中,你可以直接導入CIFilter.h頭文件進行下一步的開發。

2.創建一個CIFilter對象,並修改一種屬性值,輸出UIImage

由於在日常的iOS開發中,我們常用的圖片對象是UIImage,它是屬於UIKit.framework的,而CIFilter是屬於Coreimage.framework。他們之間是不能直接進行轉化的,這就需要藉助中間層——CoreGraphics.framework。

UIImage *inputImageUI = [UIImage imageNamed:@"1"];
CIImage *inputImageCI = [CIImage imageWithCGImage:inputImageUI.CGImage];
CIFilter *filterCI = [CIFilter filterWithName:filterName];
[filterCI setValue:inputImageCI forKey:kCIInputImageKey];
// 調節圖片亮度
[filterCI setValue:[NSNumber numberWithFloat:0.6] forKey:@"inputBrightness"];
CIImage *outputImage = [filterCI outputImage];

CIContext *contextCI = [CIContext contextWithOptions:nil];
CGImageRef targetImageCG = [contextCI createCGImage:outputImage fromRect:[inputImageCI extent]];
UIImage *targetImage = [UIImage imageWithCGImage:targetImageCG];
CGImageRelease(targetImageCG);

3.使用小技巧

CIFilter中包含很多的category,每個category又包含很多的Filter,如何找到自己需要的某個Filter呢。
直接進入CIFilter頭文件你可以找到所有的category常量:

/* Categories */
CORE_IMAGE_EXPORT NSString * const kCICategoryDistortionEffect;
CORE_IMAGE_EXPORT NSString * const kCICategoryGeometryAdjustment;
CORE_IMAGE_EXPORT NSString * const kCICategoryCompositeOperation;
CORE_IMAGE_EXPORT NSString * const kCICategoryHalftoneEffect;
CORE_IMAGE_EXPORT NSString * const kCICategoryColorAdjustment;
CORE_IMAGE_EXPORT NSString * const kCICategoryColorEffect;
CORE_IMAGE_EXPORT NSString * const kCICategoryTransition;
CORE_IMAGE_EXPORT NSString * const kCICategoryTileEffect;
CORE_IMAGE_EXPORT NSString * const kCICategoryGenerator;
CORE_IMAGE_EXPORT NSString * const kCICategoryReduction NS_AVAILABLE(10_5, 5_0);
CORE_IMAGE_EXPORT NSString * const kCICategoryGradient;
CORE_IMAGE_EXPORT NSString * const kCICategoryStylize;
CORE_IMAGE_EXPORT NSString * const kCICategorySharpen;
CORE_IMAGE_EXPORT NSString * const kCICategoryBlur;
CORE_IMAGE_EXPORT NSString * const kCICategoryVideo;
CORE_IMAGE_EXPORT NSString * const kCICategoryStillImage;
CORE_IMAGE_EXPORT NSString * const kCICategoryInterlaced;
CORE_IMAGE_EXPORT NSString * const kCICategoryNonSquarePixels;
CORE_IMAGE_EXPORT NSString * const kCICategoryHighDynamicRange;
CORE_IMAGE_EXPORT NSString * const kCICategoryBuiltIn;
CORE_IMAGE_EXPORT NSString * const kCICategoryFilterGenerator NS_AVAILABLE(10_5, 9_0);

對應category的所有子類,你只需要:

NSLog(@"%@", [CIFilter filterNamesInCategory:kCICategoryBuiltIn]);

或者查閱相關的官方文檔:

Core Image Filter Reference

對於單個的category你也許不知道有哪些attribute值是可調整的,或者某個值的取值範圍,那麼你也只需要:

NSLog(@"%@", [[CIFilter filterWithName:@"CIColorControls"] attributes]);

4.個人使用中遇到的問題(待完善)

本人在使用CIFilter的過程中曾經遇到一個模糊處理的問題,在這裏簡單描述一下問題和處理辦法。
需求:對某個視圖添加模糊蒙版。
實現方式:截取當前視圖爲一張圖片,對圖片進行高斯模糊,顯示圖片到當前視圖作爲蒙版。
問題:直接調節圖片的高斯模糊值,會使圖片邊緣趨於透明或者模糊不明顯,並且高斯模糊半徑值越大,邊緣透明部分越多。
解決方案:結合CIAffineClamp和CIGaussianBlur同時使用。
部分UIImageCategory代碼:

- (UIImage *)adjustImageAffineClampAndBlurImageWithGaussianRadiusValue:(CGFloat)radiusValue
{
CIContext *context   = [CIContext contextWithOptions:nil];
CIImage *sourceImage = [CIImage imageWithCGImage:self.CGImage];

NSString *clampFilterName = @"CIAffineClamp";
CIFilter *clamp = [CIFilter filterWithName:clampFilterName];
[clamp setValue:sourceImage forKey:kCIInputImageKey];
CIImage *clampResult = [clamp valueForKey:kCIOutputImageKey];

NSString *gaussianBlurFilterName = @"CIGaussianBlur";
CIFilter *gaussianBlur           = [CIFilter filterWithName:gaussianBlurFilterName];
[gaussianBlur setValue:clampResult forKey:kCIInputImageKey];
[gaussianBlur setValue:[NSNumber numberWithFloat:radiusValue] forKey:@"inputRadius"];
CIImage *gaussianBlurResult = [gaussianBlur valueForKey:kCIOutputImageKey];

CGImageRef cgImage = [context createCGImage:gaussianBlurResult fromRect:[sourceImage extent]];

UIImage *blurredImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);

return blurredImage;
}

小結

CIFilter的使用十分簡單,而且功能相當強大,基本可以滿足應用中對圖片處理的大部分需求,希望本文可以幫你解決圖片處理的問題。
令,如果想要對圖片進行特徵識別等特殊的操作,你也不妨學習瞭解一下一套非常強大的三方c++圖片處理庫——Opencv。

                                    杏樹林研發  溫天恩
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章