這是我為 Photoshop 編寫的一個檔案格式插件,IcoFormat,用於讀寫 Windows 圖示檔案(副檔名為ICO, CUR)。圖示檔案格式的PS插件在很多年前有一個老外曾經寫過,不過我現在提供的插件則功能上更好,有足夠的理由替換掉老外提供的插件。
老外的插件的特點我記得不是很清楚了,大概根據記憶對比如下:
(1)老外的插件在文件對話框中選擇該插件時,無法顯示 ICO 文件。可能是因為他的 PiPL 資源寫的有問題。我的插件沒有該問題。
(2)老外的插件在開啟含有多個圖像的檔案時,無法預覽,而我提供了對話框上的預覽圖,對使用者更友善。
(3)老外的插件對圖示的透明部分不能很好處理(記憶中),而用我的插件,你可以很好的設定透明部分。
(4)老外的插件不能保存XP系統的多圖像的反鋸齒圖標,而我的插件能保存為反鋸齒圖標,並且自動生成其他質量和標準大小的圖像(這一點我認為是最重要的替換老外的插件的理由)。
(5)影像降級時採用了八叉樹演算法,降級後的影像品質比例如IconWorkshop之類的軟體所採用的方法更好。
(6)我的插件是 scripting-aware 的(即插件參數會存放在PS腳本系統中),在運行時可以記住使用者的設定。
(7)我的插件可以開啟和儲存遊標(CUR)文件,老外的插件貌似不能。而我可能還會後續繼續開發從PE檔案匯入圖示等其他功能。
下面主要是對這個插件一些簡單的說明和介紹。這個外掛一共有4個對話框,分別是關於對話框,影像選取對話框(開啟檔案時),透明部分設定對話框,影像儲存選項設定對話框。下面我將一一展示一下。
(1)圖像選擇對話框
當打開含有多個圖像的圖示時,會彈出一個主要對話框:🎀『要求使用者從檔案中選擇一個要開啟的圖像,「添加AND MASK或Alhpa為獨立通道」是指,如果是32 BPP 以下的圖標,會把AND MASK (黑白兩色位圖,白色表示透明)添加到PS中的新通道,如果是32 BPP 圖標,會把 Alpha 頻道加入為PS 中新建頻道。 「是否顯示棋盤網格」是針對對話框上的圖像預覽圖而言的,如果勾選,實際上是調用了 PS 中的回調函數進行繪製的,否則是透過 WIN32 的 GDI 函數繪製的。
(2)影像品質選擇對話方塊 當儲存檔案時,依照影像模式的不同彈出不同對話方塊。如果目前的影像模式是RGB模式,則會跳出下面的對話框,要求使用者設定要儲存為什麼品質的圖示。如果你選擇的是反鋸齒圖標,我會自動的為文件中增加其他大小和顏色質量的圖像(最後文件中可能含有3 到12 個圖像,具體個數將依據文件尺寸和標準圖像尺寸之間的關係決定),此插件產生的反鋸齒圖示完全是參考MSDN 對XP 系統使用的圖示的要求而產生的,所以此插件產生的反鋸齒圖示可以直接導入到VS 的Windows 應用程式專案中進行使用。關於反鋸齒圖標,可以參考我之前的文章。
下面的拉伸模式選項,僅針對 32BPP 反鋸齒圖示時有效,因為在這裡只有 32 BPP 涉及到需要縮小影像。所謂刪除像素是指像素重疊時,只會取影像上的某一個像素。線性內插是指在來源圖上的某4個像素中取一個線性內插。從原則上講,刪除像素比線性插值的運算量小,而線性插值的縮放品質可能更好一點,但是實際上很難感受到太大差異。
如果選擇的是 16 BPP,則保存的影像是 X-5-5-5 分佈的影像。選擇 4 BPP 或 8 BPP 影像時採用的影像降級演算法是八叉樹演算法(我在前一篇文章中曾經介紹過)。由於八叉樹演算法在顏色數量很少時可能會使影像突變成全部同一個顏色,所以我沒有提供保存為單色影像的選項(最低BPP是4)。下圖顯示了把一個圖示降級儲存後的影像品質效果:
透過這個插件你可以很容易把PNG圖片,轉換成反鋸齒圖示。方法是:在PS中開啟PNG圖片,然後再另存為 ICO 檔案即可。
(3)AND MASK設定對話方塊
儲存檔案時,若影像為索引模式,請使用者設定透明部分(AND MASK部分)。預設選項是直接使用 PS 文件本身的透明訊息,但這個對話框也允許你選擇其他方式去設定透明資訊。
這裡有很多設置,你可以用下拉框切換,則下方可能會提供不同的輸入介面。你可以設定透明色為黑色,白色,前景,背景,某個取樣點的顏色,某個指定RGB顏色,或是alpha通道(白色表示透明),或是指定一個顏色表中的索引。
(4)關於對話框
你可以在PS的菜單:幫助-關於增效工具-ICO...中看到它,這個框也是我精心設計的,還是漂亮的。當你在這個對話框中移動滑鼠時,能看到我的部落格網址對滑鼠的回饋,你可以在網址上面點擊,也就是呼叫預設瀏覽器打開網址。這是透過PS提供的 CallBack Suite 實現的,我在之前寫的如何編寫 PS 濾鏡的教程中曾經介紹過。
(5)其他說明:
(5)其他說明:
(5)其他說明:
該文件(5)索引圖像的八叉樹演算法,這些文章發表的目的都是為本插件所做的技術準備。要開發這個插件,需要耗費很大精力,包括研究 ICO 檔案格式,PS SDK 等等。已參考的資料(例如八叉樹演算法)在先前的部落格文章中已有介紹,在此省略。
5.1 如果檔案中沒有指定 X,Y 分辨率,則我會在 PS 中保持 PS 的預設值:72像素/英吋。
5.2 如果開啟了索引影像,你可以在選單:影像-模式-色彩表 中看到目前的色表。由於有些軟體(例如AcdSee)無法正確解析色表為實際顏色數量的影像,所以當我儲存檔案時,色表一律設定為 16 或 256,而不是實際的色彩數量。
5.3 本插件尤其適用於以下用戶,我會向下列人群強烈推薦你安裝這個插件:
PS熟練用戶,Windows 圖標設計師, 喜歡自己參與UI 設計的程式設計師,工程師等技術人員(就像我這樣的人)。
這個插件使用戶可以完全利用到Photoshop 的強大圖像處理能力,而不再受限於VC,VS.NET 等IDE的有限編輯能力,這樣你就能藉助Photoshop 製作出更漂亮的圖標,當然你也可以很方便的把網路上很多PNG 素材方便的轉換成在程式中使用的圖示。
我衷心的希望有更多的人喜歡它,使用它。如果你有任何的使用意見和建議和需求,歡迎你在我的部落格留言,或發送 Email 到我的信箱(信箱地址位於左側的公告欄)。
(6)最後是該插件的發行包的下載連接:
(7)安裝方法: 把「IcoFormat .8BI」 檔案複製到Photoshop的檔案格式外掛程式目錄①,例如C:Program FilesAdobePhotoshop CS增效工具檔案格式,重新啟動PS 即可。檢查在PS的選單中如果有下面的選單:“幫助-關於增效工具-ICO...”,則說明插件安裝成功。
(所有小於255的都被設定為透明),已避免顯示出比較生硬的陰影。 2010-12-17。
8.2 H: 修正在保存32BPP反鋸齒圖標,選擇線性插值時,錯誤的將Alpha通道也使用線性插值的BUG(正確的做法是 Alpha 通道依然用刪除像素方法生成)。該BUG導致在產生其他大小的圖像時,可能會錯誤的使不應該透明的像素成為透明。值得一提的是,此 BUG 是由 8.1 引入的。 2010-12-18 2:04:15。
8.3 L: 修正以下BUG,開啟圖示中的索引影像,取消勾選「開啟影像透明效果」選項,但結果有時仍套用了透明。 2010-12-18 3:36:08。
8.4 H: 調整了插件的 PIPL 資源,使濾鏡可以直接從 PS 中獲取到文件的透明資訊(不再需要用戶明確提供附加通道了)。調整了線性內插的程式碼中邏輯不夠準確的部分,並避免像素與來源圖上的透明部分(黑色)合成。 2010-12-19 0:55:23。
8.5 M: 調整了產生 32 BPP 圖示的邏輯,直接從 PS 文件中的資料去降級影像 (原方式在產生索引影像時偶髮色彩缺失,原因不詳)。 2010-12-19 1:41:08。
8.6 L: 增加儲存為 32 BPP 單一影像的反鋸齒圖示選項。 2010-12-22 2:05:30。
8.7 L: 讀取索引影像時,設定透明的方法重新改為先前的方法。可以確保應用透明更加準確,對於16色圖像一定會正確應用透明,對256色圖像嘗試尋找把圖像上沒有使用的顏色作為透明色,因此有可能無法應用透明。此方法主要缺點是,另存為時,可能使16色索引影像升級成256色影像。 2010-12-23 2:57:17。
8.8 L: 細微調整了讀取 16 BPP 影像的像素取值的線性映射方法(影響不大)。 2010-12-24 18:48。
(9)致謝:
感謝 Chris Cox (Adobe 員工)在官方論壇上對我提的問題給予答复。
Adoble 論壇的 Photoshop SDK 版塊網址:
http://forums.adobe.com/community/photoshop/photo〜10o🀜
13/photo10.1 八叉樹演算法(位址略)。
10.2 Photoshop SDK(6.0, CS)。
10.3 ICONPRO(MSDN 技術文件中提供的範例)。
(11)本文中使用的術語介紹
11.1 BPP(Bits Per Pixel)🀎其意義是描述每個像素所使用的位數(一個位元組含有8位元)。例如對於 RGB 真彩色點陣圖來說,每個像素以三個位元組表示,其BPP = 24。黑白影像(二元點陣圖)的位元深度為1。16色索引影像的位元深度為4(每個位元組可表示兩個像素),256色索引影像的位元深度為8(每個位元組表示一個像素)。通常位元深度除以8,就是表示每個像素的位元組個數。
我們常說的灰度圖像實際上並不是一種專有格式,而是一種特殊的256色索引圖像,其調色板的特徵是每個顏色的R,G,B三個分量是相等的,256個調色板顏色從(0,0,0)到(255,255,255),因此其圖像資料的值本質上仍然是顏色索引,但同時也可以理解為其灰度的亮度。
11.2 反鋸齒(AntiAlias)
這裡是我個人的譯法,可能不夠準確,可能應該稱為抗鋸齒才更符合更多人的習慣。這是一種使用半透明像素的技術,用於消除鋸齒感。首先我們要了解的是鋸齒感其產生的原因是顯示器呈現影像使用的是一個密集的矩陣柵格,GDI按照電腦影像演算法設定點陣像素(本質上把數學的類比訊號變成離散化後的數位化訊號),這種呈現類型的直線看起來帶有鋸齒,有點像樓梯。相鄰像素的非平滑性突變使人產生鋸齒觀感。
更為複雜的呈現直線的技術需要使用部分透明的像素和不透明的像素。像素被設為純色或與背景色的混合色(取決於它們和直線的接近程度)。這種呈現方式稱為消除鋸齒,它可以產生視覺上更感平滑,柔和的直線。
本文中提到的反鋸齒圖標,指的是 32 BPP 的圖像。即每個像素以4個位元組表示,分別代表的是R,G,B,A(lpha),比普通RGB位圖多出來的一個 Alpha 通道,用來描述該像素的透明程度。因此能夠指定像素的半透明,從而和背景產生柔和的融合,即達到反鋸齒的效果。
① PS 插件目錄通常是指$(PS INSTALL DIR) Plug-Ins,只要把第三方插件的檔案(.8B*)放在這個目錄下,PS在啟動時就會去掃描並嘗試載入這個目錄下的8B* 檔。插件是什麼種類,不是由後綴名決定的,而是由其PIPL屬性指定的。在這個目錄下,又可以依照插件種類建立對應的子目錄。例如濾鏡(Filter),檔案格式(File Format),但要注意只要把檔案放到PS的插件目錄即可被PS嘗試載入。外掛目錄可以透過尋找登錄的下列位置:
HKEY_LOCAL_MACHINESOFTWAREAdobePhotoshop(版本號,例如8.0)PluginPath
是錯誤的,所以這給我們為插件提供一個更簡單易用的安裝工具造成了一點小障礙。對英文版來說,可以認為就是PS安裝目錄下面的 Plug-Ins 子目錄。
更多 用於讀寫ICO圖示檔案的 Photoshop 插件相關文章請關注PHP中文網!