Core Image框架詳細解析(十六) —— 包裝和載入影像單元 Packaging and Loading Image Units...

weixin_33782386發表於2018-01-29

版本記錄

版本號 時間
V1.0 2018.01.29

前言

Core Image是IOS5中新加入的一個框架,裡面提供了強大高效的影像處理功能,用來對基於畫素的影像進行操作與分析。還提供了很多強大的濾鏡,可以實現你想要的效果,下面我們就一起解析一下這個框架。感興趣的可以參考上面幾篇。
1. Core Image框架詳細解析(一) —— 基本概覽
2. Core Image框架詳細解析(二) —— Core Image濾波器參考
3. Core Image框架詳細解析(三) —— 關於Core Image
4. Core Image框架詳細解析(四) —— Processing Images處理影像(一)
5. Core Image框架詳細解析(五) —— Processing Images處理影像(二)
6. Core Image框架詳細解析(六) —— 影像中的面部識別Detecting Faces in an Image(一)
7. Core Image框架詳細解析(七) —— 自動增強影像 Auto Enhancing Images
8. Core Image框架詳細解析(八) —— 查詢系統中的過濾器 Querying the System for Filters
9. Core Image框架詳細解析(九) —— 子類化CIFilter:自定義效果的配方 Subclassing CIFilter: Recipes for Custom Effects(一)
10. Core Image框架詳細解析(十) —— 子類化CIFilter:自定義效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二)
11. Core Image框架詳細解析(十一) —— 獲得最佳效能 Getting the Best Performance
12. Core Image框架詳細解析(十二) —— 使用反饋處理影像 Using Feedback to Process Images
13. Core Image框架詳細解析(十三) —— 在寫一個自定義濾波器之前你需要知道什麼?
14. Core Image框架詳細解析(十四) —— 建立自定義濾波器 Creating Custom Filters(一)
15. Core Image框架詳細解析(十五) —— 建立自定義濾波器 Creating Custom Filters(二)

Packaging and Loading Image Units - 包裝和載入影像單元

影像單元表示Core Image過濾器的外掛體系結構。 影像單元使用NSBundle類作為打包機制,允許您將建立的過濾器提供給其他應用程式。 影像單元可以包含可執行或不可執行的過濾器。 (有關詳細資訊,請參閱Executable and Nonexecutable Filters。)

要從自定義過濾器建立影像單元,您必須執行以下任務:

閱讀完本章之後,你可能也想


Before You Get Started - 在你開始前

下載CIDemoImageUnit示例。 當你建立一個影像單元時,你應該有類似的檔案。 這個影像單元包含一個過濾器FunHouseMirror。 影像單元中的每個過濾器通常都有三個檔案:過濾器類的介面檔案,關聯的實現檔案和核心檔案。 正如你可以在示例程式碼專案中看到的那樣,FunHouseMirror過濾器是這樣的:FunHouseMirrorFilter.h,FunHouseMirrorFilter.m和funHouseMirror.cikernel

每個影像單元還應該具有CIPlugInRegistration協議的介面和實現檔案。 在該圖中,請參閱MyPlugInLoader.hMyPlugInLoader.m。 您需要修改的另一個重要檔案是Description.plist檔案。

現在,您已經瞭解了一些影像單元專案中的檔案,現在可以建立一個。


Create an Image Unit Project in Xcode - 在Xcode中建立一個影像單元專案

Xcode提供了一個建立影像單元的模板。 在建立一個影像單元專案之後,您將擁有大部分需要開始的檔案,並且該專案將連結到適當的框架。

在Xcode中建立一個影像單元專案

  • 啟動Xcode並選擇File> New Project
  • 在模板視窗中,選擇System Plug-in > Image Unit Plug-in。 然後點選下一步。
  • 命名影像單元專案,然後單擊完成。

專案視窗隨著建立的這些檔案開啟:

  • MyImageUnitPlugInLoader.hMyImageUnitPlugInLoader.mCIPlugInRegistration協議的介面和實現檔案
  • MyImageUnitFilter.hMyImageUnitFilter.m
  • MyImageUnitFilterKernel.cikernel

影像單元專案中提供的MyImageUnitKernelFilter.cikernel檔案是一個示例核心檔案。 如果你已經建立了一個過濾器,你將不需要這個檔案,所以你可以刪除它。 你會在短時間內將自己新增到專案中。


Customize the Load Method - 自定義載入方法

開啟實施CIPlugInRegistration協議的檔案。 在其中你會發現一個load方法,如Listing 10-1所示。 您可以選擇向此方法新增程式碼以執行所需的任何初始化,例如註冊檢查。 如果過濾器已成功載入,則該方法返回true。 如果您不需要任何自定義初始化,則可以保持原樣裝入方法。

Listing 10-1  The load method provided by the image unit template

-(BOOL)load:(void*)host
{
    // Custom image unit initialization code goes here
    return YES;
}

如果需要,可以編寫unload方法來執行過濾器可能需要的任何清理任務。


Add Your Filter Files to the Project - 將您的篩選檔案新增到專案

將之前建立的過濾器檔案新增到影像單元專案。 回想一下,您將需要每個過濾器和關聯的核心檔案的介面和實現檔案。 如果尚未編寫過濾器,請參閱Creating Custom Filters

請記住,您可以在一個影像單元中打包多個過濾器,並且可以為過濾器提供所需的多個核心檔案。 只要確保包含了要打包的所有篩選器和核心檔案。


Modify the Description Property List - 修改描述屬性列表

對於可執行過濾器,只能從Description.plist檔案中讀取版本號,過濾器類和過濾器名稱。 您可以在程式碼中提供過濾器的屬性列表(請參閱Write a Custom Attributes Method)。 您需要檢查影像單元模板中提供的Description.plist檔案,確保過濾器名稱正確並輸入版本號。

對於CPU不可執行的過濾器,影像單元主機將讀取Description.plist檔案以獲取有關表10-1中列出的過濾器屬性的資訊。 您需要修改Description.plist檔案,使其包含適當的資訊。 (有關過濾器鍵的資訊,另請參閱Core Image Reference Collection)。

3691932-b808a2085e4dab4e.png
Keys in the filter description property list

Table 10-2列出了輸入引數類和與每個類關聯的值。 對於不可執行的過濾器,可以為每個輸入和輸出引數提供引數類別。

3691932-4d97978c35be1a62.png

Build and Test the Image Unit - 建立和測試影像單元

在開始建立影像單元之前,您應該測試核心程式碼以確保其正常工作。 (請參閱 Use Quartz Composer to Test the Kernel Routine。),成功構建影像單元后,您需要將其複製到以下目錄:

  • /Library/Graphics/Image Units
  • ~/Library/Graphics/Image Units

然後,您應嘗試從應用程式中載入影像單元,並使用包裝在單元中的過濾器(或多個過濾器)。 請參閱 Loading Image UnitsQuerying the System for FiltersProcessing Images


Loading Image Units - 載入影像單元

Apple提供的內建過濾器會自動載入。 您需要載入的唯一過濾器是打包成影像單元的第三方過濾器。 一個簡單的影像單元可以包含一個或多個影像處理過濾器。 如果影像單元安裝在Build and Test the Image Unit中討論的位置之一中,則可由任何呼叫CIPlugin類提供的load方法之一的應用程式使用,如表10-3所示。 您只需要載入一次影像單位。 例如,要載入所有全域性安裝的影像單元,可以將以下程式碼行新增到應用程式的初始化例程中。

 [CIPlugIn loadAllPlugIns];

呼叫load方法後,您將繼續使用Apple提供的任何影像處理過濾器。 按照本章其餘部分的說明進行操作。

3691932-a40db383b050418d.png

See Also - 也可參考

  • Image Unit Tutorial(影像單元教程)提供了編寫各種核心的步驟說明,並將它們打包為影像單元。
  • CIDemoImageUnit是一個示例影像單元Xcode專案。

後記

本篇已完成,後面更精彩~~~

3691932-1e4b31a80fea7eda.jpg

相關文章