前言
CIFilter
是Core Image中一個比較核心的有關(guān)濾鏡使用的類委刘。
通常CIFilter
對象需要一個或多個圖像作為輸入鸳劳,并產(chǎn)生CIImage
類型的實(shí)體作為輸出戈锻。而這些輸出圖像的生產(chǎn)過程需要我們通過設(shè)置一些參數(shù)來實(shí)現(xiàn)编兄,而這些參數(shù)的設(shè)置和檢索都是利用鍵/值
對的形式進(jìn)行操作的轩性。
在使用CIFlilter
的時候我們通常會用到:
CIImage
、CIContext
狠鸳、CIVector
揣苏、CIImageAccumulator
、CIColor
等...
也可以使用CIKernel
件舵、CISampler
和CIFilterShape
創(chuàng)建自定義過濾器卸察。
其中CIFlilter
承載著所有設(shè)置好的濾鏡參數(shù)以CIImage
為基礎(chǔ),在CIContext
對象中進(jìn)行渲染铅祸。要提一下的是濾鏡的使用是可以疊加的坑质,我們可以使用多種濾鏡處理同一個圖像合武。在之前的文章中曾也介紹過,Core Image
的渲染分為CPU
和GPU
兩種涡扼,其中使用CPU
渲染可以在后臺進(jìn)行稼跳,但是渲染速度沒有GPU
快,而GPU
是不能進(jìn)行后臺渲染的它是實(shí)時的吃沪,在進(jìn)行視頻幀渲染時我們就可以使用GPU
進(jìn)行渲染汤善。
獲取所有濾鏡
目前iOS9.3版本中的濾鏡分類有:
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);
NSArray* filters = [CIFilter filterNamesInCategory:kCICategoryDistortionEffect];
for (NSString* filterName in filters) {
NSLog(@"filter name:%@",filterName);
// 我們可以通過filterName創(chuàng)建對應(yīng)的濾鏡對象
CIFilter* filter = [CIFilter filterWithName:filterName];
NSDictionary* attributes = [filter attributes];
// 獲取屬性鍵/值對(在這個字典中我們可以看到濾鏡的屬性以及對應(yīng)的key)
NSLog(@"filter attributes:%@",attributes);
}
創(chuàng)建
// 通過濾鏡的名稱創(chuàng)建。在OSX中票彪,所有屬性值都是未定義的红淡。在iOS中,所有屬性值將被設(shè)置為默認(rèn)值抹镊。
+ (nullable CIFilter *)filterWithName:(NSString *)name;
// 通過濾鏡的名稱創(chuàng)建并通過鍵/值對設(shè)置濾鏡的相關(guān)屬性锉屈。在OSX中,所有屬性值都是未定義的垮耳。在iOS中颈渊,所有屬性值將被設(shè)置為默認(rèn)值。
+ (nullable CIFilter *)filterWithName:(NSString *)name
keysAndValues:key0, ... NS_REQUIRES_NIL_TERMINATION NS_SWIFT_UNAVAILABLE("");
// 通過濾鏡的名稱創(chuàng)建并通過帶有屬性值的字典設(shè)置濾鏡的相關(guān)屬性终佛。在OSX中俊嗽,所有屬性值都是未定義的。在iOS中铃彰,所有屬性值將被設(shè)置為默認(rèn)值绍豁。
+ (nullable CIFilter *)filterWithName:(NSString *)name
withInputParameters:(nullable CI_DICTIONARY(NSString*,id) *)params NS_AVAILABLE(10_10, 8_0);
方法
// 設(shè)置濾鏡屬性為默認(rèn)值(默認(rèn)值定義,其他設(shè)置保持不變)
- (void)setDefaults;
// 返回當(dāng)前類別下的所有濾鏡
+ (CI_ARRAY(NSString*) *)filterNamesInCategory:(nullable NSString *)category;
// 返回當(dāng)前多個類別下的所有濾鏡
+ (CI_ARRAY(NSString*) *)filterNamesInCategories:(nullable CI_ARRAY(NSString*) *)categories;
// 注冊一個新的濾鏡名,anObject參數(shù)必須是以filterWithName:方法創(chuàng)建的對象牙捉,并且屬性中要有kCIAttributeFilterCategories鍵和相關(guān)類別的設(shè)置竹揍。attributes參數(shù)是要注冊的濾鏡屬性。
+ (void)registerFilterName:(NSString *)name
constructor:(id<CIFilterConstructor>)anObject
classAttributes:(CI_DICTIONARY(NSString*,id) *)attributes NS_AVAILABLE(10_4, 9_0);
// 返回一個濾鏡的本地化名稱
+ (nullable NSString *)localizedNameForFilterName:(NSString *)filterName NS_AVAILABLE(10_4, 9_0);
// 返回一個類別的本地化名稱
+ (NSString *)localizedNameForCategory:(NSString *)category NS_AVAILABLE(10_4, 9_0);
// 返回一個濾鏡的本地化描述
+ (nullable NSString *)localizedDescriptionForFilterName:(NSString *)filterName NS_AVAILABLE(10_4, 9_0);
// 返回濾鏡的文檔鏈接
+ (nullable NSURL *)localizedReferenceDocumentationForFilterName:(NSString *)filterName NS_AVAILABLE(10_4, 9_0);
屬性
// 輸出圖像邪铲,只讀
@property (readonly, nonatomic, nullable) CIImage *outputImage NS_AVAILABLE(10_10, 5_0);
#if TARGET_OS_IPHONE
// iOS中是只讀的
@property (nonatomic, readonly) NSString *name NS_AVAILABLE_IOS(5_0);
#else
// OSX中是讀寫的芬位,這個屬性可以在使用CALayers的時候用作唯一標(biāo)示
@property (nonatomic, copy) NSString *name NS_AVAILABLE_MAC(10_5);
// 這個屬性只有在OSX中才有,
@property (getter=isEnabled) BOOL enabled NS_AVAILABLE_MAC(10_5);
#endif
// 只讀带到,返回一個數(shù)組昧碉,包含濾鏡中所有輸入名字
@property (nonatomic, readonly) CI_ARRAY(NSString*) *inputKeys;
// 只讀,返回一個數(shù)組揽惹,包含濾鏡中所有輸出名字
@property (nonatomic, readonly) CI_ARRAY(NSString*) *outputKeys;
// 只讀被饿,返回一個字典,其中包含描述濾鏡的鍵/值對
@property (nonatomic, readonly) CI_DICTIONARY(NSString*,id) *attributes;
使用
// 創(chuàng)建輸入CIImage對象
CIImage * inputImg = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"1.png"]];
// 創(chuàng)建濾鏡
CIFilter * filter = [CIFilter filterWithName:@"CIColorInvert"];
// 設(shè)置濾鏡屬性值為默認(rèn)值
[filter setDefaults];
// 設(shè)置輸入圖像
[filter setValue:inputImg forKey:@"inputImage"];
// 獲取輸出圖像
CIImage * outputImg = [filter valueForKey:@"outputImage"];
// 創(chuàng)建CIContex上下文對象
CIContext * context = [CIContext contextWithOptions:nil];
CGImageRef cgImg = [context createCGImage:outputImg fromRect:outputImg.extent];
UIImage *resultImg = [UIImage imageWithCGImage:cgImg];
CGImageRelease(cgImg);
這里使用了一個反色的濾鏡搪搏,效果如下:
由于蘋果提供了很多濾鏡狭握,通常情況下是不會去熟練掌握每一種濾鏡的,所以我們可以挑選我們想要使用的濾鏡進(jìn)行詳細(xì)研究慕嚷。
首先可以打印出濾鏡的屬性字典哥牍,通過key的字面意思以及實(shí)際設(shè)置之后的運(yùn)行效果來理解濾鏡中的各種屬性的含義毕泌。
上一篇:iOS圖像處理(二)Core Image介紹
下一篇:iOS圖像處理(四)CIDetector圖像識別(人臉識別)
版權(quán)聲明:出自MajorLMJ技術(shù)博客的原創(chuàng)作品 喝检,轉(zhuǎn)載時必須注明出處及相應(yīng)鏈接嗅辣!