iOS圖像處理(三)CIFilter濾鏡介紹

前言

CIFilter是Core Image中一個比較核心的有關(guān)濾鏡使用的類委刘。
通常CIFilter對象需要一個或多個圖像作為輸入鸳劳,并產(chǎn)生CIImage類型的實(shí)體作為輸出戈锻。而這些輸出圖像的生產(chǎn)過程需要我們通過設(shè)置一些參數(shù)來實(shí)現(xiàn)编兄,而這些參數(shù)的設(shè)置和檢索都是利用鍵/值對的形式進(jìn)行操作的轩性。

在使用CIFlilter的時候我們通常會用到:
CIImageCIContext狠鸳、CIVector揣苏、CIImageAccumulatorCIColor等...
也可以使用CIKernel件舵、CISamplerCIFilterShape創(chuàng)建自定義過濾器卸察。

其中CIFlilter承載著所有設(shè)置好的濾鏡參數(shù)以CIImage為基礎(chǔ),在CIContext對象中進(jìn)行渲染铅祸。要提一下的是濾鏡的使用是可以疊加的坑质,我們可以使用多種濾鏡處理同一個圖像合武。在之前的文章中曾也介紹過,Core Image的渲染分為CPUGPU兩種涡扼,其中使用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)鏈接嗅辣!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挠说,隨后出現(xiàn)的幾起案子澡谭,更是在濱河造成了極大的恐慌,老刑警劉巖损俭,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛙奖,死亡現(xiàn)場離奇詭異,居然都是意外死亡杆兵,警方通過查閱死者的電腦和手機(jī)雁仲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琐脏,“玉大人攒砖,你說我怎么就攤上這事∪杖梗” “怎么了吹艇?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昂拂。 經(jīng)常有香客問我受神,道長,這世上最難降的妖魔是什么格侯? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任鼻听,我火速辦了婚禮,結(jié)果婚禮上联四,老公的妹妹穿的比我還像新娘撑碴。我一直安慰自己,他們只是感情好碎连,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布灰羽。 她就那樣靜靜地躺著,像睡著了一般鱼辙。 火紅的嫁衣襯著肌膚如雪廉嚼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天倒戏,我揣著相機(jī)與錄音怠噪,去河邊找鬼。 笑死杜跷,一個胖子當(dāng)著我的面吹牛傍念,可吹牛的內(nèi)容都是我干的矫夷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼憋槐,長吁一口氣:“原來是場噩夢啊……” “哼双藕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阳仔,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忧陪,失蹤者是張志新(化名)和其女友劉穎戳气,沒想到半個月后售担,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伏社,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年评矩,在試婚紗的時候發(fā)現(xiàn)自己被綠了叶堆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡斥杜,死狀恐怖虱颗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情果录,我是刑警寧澤上枕,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站弱恒,受9級特大地震影響辨萍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜返弹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一锈玉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧义起,春花似錦拉背、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至齐蔽,卻和暖如春两疚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背含滴。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工诱渤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谈况。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓勺美,卻偏偏與公主長得像递胧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赡茸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 原鏈接:http://www.csdn.net/article/2015-02-13/2823961-core-i...
    hament閱讀 1,015評論 0 1
  • 前言 最近在研究 Core Image 自定義 Filter 相關(guān)內(nèi)容缎脾,重新學(xué)習(xí)了 Core Image,對 Co...
    泥孩兒0107閱讀 775評論 0 4
  • 老驥伏櫪坛掠,志在千里 前記 最近一直在研究圖像處理方面赊锚,既上一篇iOS Quart2D繪圖之UIImage簡單使用后...
    半笑半醉間閱讀 4,408評論 0 14
  • 許多UIView的子類治筒,如一個UIButton或一個UILabel屉栓,它們知道怎么繪制自己。遲早耸袜,你也將想要做一些自...
    shenzhenboy閱讀 1,652評論 2 8
  • Core Image是一個強(qiáng)大的框架友多,它能夠讓你輕松地對圖像進(jìn)行過濾。你能夠通過修改圖像的飽和度堤框、色調(diào)或曝光率來獲...
    木易林1閱讀 1,142評論 0 1