首頁  >  文章  >  web前端  >  Photoshop濾鏡開發簡介--Photoshop回呼函數

Photoshop濾鏡開發簡介--Photoshop回呼函數

高洛峰
高洛峰原創
2017-02-20 09:34:532156瀏覽

        在上一篇文章中,我們介紹了開發Photoshop濾鏡外掛程式最基本的一些概念和基礎。 Ps為了滿足插件的應用需求,同時也為插件提供了大量的回呼函數(或服務)。例如,濾鏡可以在一次呼叫後,儲存最近一次使用者設定的參數,並套用到下次呼叫或顯示UI。這就是透過Ps的回調函數完成的。這篇文章我們將講解最重要的一些Ps回調函數。了解本文之後,我們將能夠使用回調函數,完成例如儲存我們的濾鏡參數等必要的工作。本篇文章將比第一篇複雜且深入的多,但同時從這篇文章我們也可以一窺PS內部的秘密:縝密的系統設計,完善的介面以及複雜的工作機制。

(一)回呼函數的分類:
         Ps的回呼函數依照取得他們的位置可以分為兩種:
     是FilterRecord的直接成員,可以從FilterRecord參數直接取得。例如AdvanceStateProc(更新資料),TestAbortProc(測試使用者取消)等,屬於此類。
        (2)Callback Suite:(回調函數集)
         把函調函數依功能分類而提供的回呼函數集,是一組回呼函數組成的集合,它是一個指標 將函調函數依功能分類而提供的回呼函數集,是一組回呼函數組成的集合,它是一個指標 指向一個功能的子體(struct),我們可以從FilterRecord取得某個回呼函數集,然後呼叫其中的函數。

         目前提供的主要回呼函數集有:
         Buffer Suite:快取記憶體管理(申請和釋放快取空間)。
         UI Hook Suite:一組和UI操作有關的函數。
         Channel Ports Suite:通道連接埠讀寫,用於讀寫PS內部的真正選區資料!而不是副本拷貝。
        
Descriptor Suite:描述子操作集,用於腳本記錄系統,它本身又包含「讀取」兩個sub-suite(子函數集)。          Color Space Suite:色彩空間服務(色彩轉換等)。
         Handle Suite:句柄管理(PS封裝的句柄與記憶體管理,和Buffer suite類似)。
         Error Suite:接收並顯示使用者錯誤訊息給使用者(接收不同類型的錯誤訊息字串)。
         GetFileList Suite:取得檔案清單(取得文件,呼叫瀏覽器瀏覽網頁等)。
         GetPath Suite:   取得路徑。
         ZString Suite:封裝字串處理。

        例如UI Hook Suite,提供了一組和UI相關的回呼函數。它的第一個版本被定義為:

UI Hooks Suite Version1

typedef 

struct PSPixelMap
{
//
取得描述子參數結構:
PIDescriptorParameters* descParams ->descriptorParameters;  if
 (descParams == NULL) return err;  ReadDescriptorProcs*

 readProcs 
= gFilterRecord->
descriptorParameters->readDescriptorProcs;  NULL) return err; / /取得「寫」子函數集:
 WriteDescriptorProcs* writeProcs = ->
writeDescriptorProcs;
 
if  (writeProcs ==
 NULL) return err;return err;
        取得了兩個子函數集,我們就可以呼叫對應子函數集下方的函數進行「讀取」「寫」我們的參數了。兩個子函數集的使用和登錄機碼操作類似,我們在進行讀寫前,首先需要開啟對應描述符。因此我們先介紹開啟和關閉描述符操作。
        OpenReadDescriptorProc( ):開啟一個「讀取」描述子
       定義: IDArray);
        參數說明:
        PIDescriptorHandle:
        。中讀寫數據,類似註冊表的Key。
        DescriptorKeyIDArray:
        uint32數組,以儲存需要查詢的key集合。其相關定義為:

                  typedef unsigned      typedef DescriptorKeyID DescriptorKeyIDArray[];
        陣列裡面的元素是您所需要的key名,即您要查詢的參數名稱,即你要求查詢哪些key。注意因為是int32型,所以每個key可以容納4個字元表示的ASCII碼,如果少於4個字節,可以用空格補足。例如,設定這個參數賦為可以設定{'Pam1','Pam2',NULL},這表示你需要查詢兩個參數,'Pam1'和'Pam2'。 例如在腳本系統中,高斯模糊(GaussianBlur)濾鏡的key是'GsnB'。
       每個鍵值透過呼叫GetKeyProc()而得到的,每回傳一個值,而這個字串陣列中的對應key將會被設定為空白('         這個函數關閉一個寫入描述符,並建立一個新的描述子句柄,你需要將新描述子透過設定到PIDescriptorParameteres中,以傳回給宿主程式。這裡的函數的行為有些類似GDI運算中的SelectObject。在GDI作業中,當你對裝置上下文設定新的屬性時,它會把現有屬性回傳給你,以期待你做個備份。


         兩個子函數集中讀出和寫入資料的函數:
    
         大多數具有比較規範的特性(有少數函數具有例外形式,我們後面單獨介紹),即讀用Get開頭,寫用Put開頭,第一個參數是對應描述符,第二個參數是用於接收查詢結果(或用於存放寫入資料)的對應類型資料指標。假設我們需要查詢的資料型態是TypeName,則如下:

          OSErr (*GetTypeNameProc) (PIReadDescriptor descriptor,);           OSErr (* PutTypeName
Proc) (PIWriteDescriptor descriptor, 
DescriptorKeyID, TypeName *dest); h中定義):Read Descriptor sub-suite

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.php.i.函數集成員

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn