GIMP外掛程式結構

2021-04-26 19:05:01 字數 2143 閱讀 4568

gimp是基於外掛程式的結構,外掛程式結構的特點是核心部分的內容並不多,更多的功能是通過外掛程式完成的。gimp是乙個圖象處理程式,支援很多圖象處理的方法,而這些方法都是以外掛程式的形式出現的。其架構如下圖所示:

gimp在它的開發者**上提供了一套外掛程式編寫教程,引導外掛程式新手入門:

how to write a gimp plug-in,第一部分,第二部分,第三部分。

我們一起來看一下,gimp是如何實現外掛程式結構的。上面的教程對外掛程式結構有個概要的介紹。

先 來看一下gimp外掛程式的存在形式。為了輔助構建gimp外掛程式,gimp提供了乙個工具——gimptool,實際上它就是對構建外掛程式過程的封裝,省去了自 己尋找相應軟體包的煩惱。執行完gimptool,我們會在gimp外掛程式的目錄(通常是~/.gimp-2.0/plug-ins)下發現我們的外掛程式。實 際上,它就是乙個標準應用程式,而不是乙個庫。它甚至可以單獨執行,當然,在一無所知的情況下執行它,它會告訴你,我要執行在gimp下。隨便檢視乙個 gimp外掛程式,甚至是上面提到的那個教程,你會發現這樣乙個巨集呼叫:main()。翻看原始碼,在$gimp/libgimp/gimp.h中,我們找到了 它,簡化之:

#  define main()     /

int       /

main (int argc, char *argv)   /

前面說過,外掛程式是乙個應用程式,這裡提供了最好的證據。gimp外掛程式的執行邏輯都隱藏在gimp_main($gimp/libgimp/gimp.c)中。

接下來,再來看看gimp的主程式是如何與外掛程式打交道的。

通 道開啟了,那接下來的工作就是二者之間如何通訊。通訊自然要有通訊的協議,對於呼叫程式來說,最簡單的通訊協議就是呼叫程式的引數。gimp外掛程式編寫通常 要指定四個函式,分別是用作初始化、退出、查詢和執行用,其中執行部分是整個外掛程式中最核心的部分。回到gimp_main的實現中,我們便不難發現,初始 化和查詢用到的呼叫方法就是程式引數的形式。這是最為簡單的方式,當然,不足以解決所有的問題,比如查詢的結果如何送回。

其實這是乙個程序 間如何通訊的問題。在*nix下,程序間通訊的方式有很多,gimp選擇的是管道(pipe)。回到plug_in_open中,在設定引數的時候,開啟 了兩個管道,分別用於讀寫。當然,隨後它又用glib的io_channel對管道進行封裝。隨後,再把兩個管道的檔案描述符(實際上就是個整數)作為調 用引數傳遞給外掛程式。外掛程式得到描述符之後,在自己這端將管道開啟,於是兩端便建立起連線。注意,管道是個半雙工的,也就是乙個管道只能讀或是寫,所 以,通常建立管道時,得到便是兩個描述符,乙個用於讀乙個用於寫。為了實現主程式和外掛程式之間的雙向通訊,同時開啟了兩個管道,也就是得到了四個描述符,兩 個作為引數傳遞給外掛程式,另外兩個留給了主程式自己。同上面的開啟程序相比,管道才是二者之間真正的通訊渠道。

一樣的討論,通道開啟了, 接下來就是通訊協議。二者之間的通訊協議選擇了二進位制的方式,這一點在開啟管道時設定了二進位制的訪問方式可見一斑。文字化還是二進位制是乙個設計上的抉擇, 這裡選擇了二進位制的方式,也許執行時效率是乙個重要的考慮因素。有乙個沒有想清楚的問題是這種程序間通訊的方式是否還需要如網路通訊一樣檢視中間流過的數 據,如果需要,又如何做呢?

僅僅是訊息級的通訊顯得還是有些低階,所以,在此基礎 上,gimp還提供了函式級通訊。我們知道gimp為編寫外掛程式提供了不少api,而有些api需要和主程式互動方能體現其作用,比如,如果需要某個外掛程式處 理一副影象,外掛程式本身並沒有影象,從何而來,它要呼叫乙個函式得到,而這個函式實際上是通過與主程式互動得到。這些函式借助就是已有的訊息級通訊完成,而 對於外掛程式的編寫者來說,一切都是透明的。如同網路協議的七層模型,這裡也是通過一層層的構建起乙個完整的體系,乙個清楚的設計。有了函式呼叫的方法,通訊 的可擴充套件性便大大增強。

上面簡要介紹了gimp外掛程式結構的實現,這便是最近學習gimp的一些心得,不見得完全準確,源**是最 好的答案。跨越時間的程式都有許多值得學習的東西,十多歲的gimp也在其中。順便說一下,gimp的實現很清楚,雖然是用c實現,但模組劃分得非常清 楚。語言限制的只是表達能力而已,而非思想。

GIMP模板選區操作

選擇方法有很多種,這裡我就新學的方法記錄一下,主要是通過小剪刀和toggle quick mask 相結合的運用。選擇scissors select tool工具 設定基本的屬性 antialisasing是防止邊緣鋸齒的,feather edges是羽化,interactive boundary可...

Ubuntu 安裝及解除安裝GIMP步驟

gimp 是 gnu 影象處理程式 gnu image manipulation program 的縮寫。包括幾乎所有圖象處理所需的功能,號稱linux下的photoshop。gimp在linux系統推出時就風靡了許多繪圖愛好者的喜愛,它的介面相當輕巧,但其功能卻不輸於專業的繪圖軟體 它提供了各種的...

使用GIMP建立透明背景的方法

gimp是乙個跨平台的影象編輯器,您可以更改其 源 並分發 您的更改。無論您是平面設計師,攝影師,插畫家還是科學家,gimp都能為您提供完善的工具來完成您的工作。借助許多自定義選項和第三方外掛程式,您可以使用gimp進一步提高工作效率。步驟 2 然後導航到 層 透明度 新增alpha通道 為影象新增...