打造自由換色的png圖片類

打造自由換色的png圖片類
 
        想像一下,有一個遊戲,裏面有很多種顏色的人,圖片完全一樣,只是人物衣服的顏色不同。比如街霸中真的紅色的Ken和假的青色的Ken,它們的圖形一模一樣,只是顏色換掉了。
這時你會怎麼做呢?畫好多張圖片?拜託,都21世紀了,別做這種沒有一點技術含量的工作好不好?聰明的你一定會想,如果可以把裏面的紅色“替換”成青色就好了。OK,那我們就來替換。
GIF、PNG等很多格式的圖片,都是用調色板來記錄顏色的。比如記錄3號顏色爲0xff0000紅色,那麼我們把3號顏色改爲青色的代碼,圖片中的所有標記爲3號顏色的區域都變成青色了。怎麼樣?說起來好像很簡單吧?^_^下面我們用J2ME手機用的最多的png格式的圖片來完成這項工作。
首先我們要清楚png圖片的格式。
首先是8 byte的png標誌。其次是若干個塊,每個塊有下列結構:
4 byte  Length 塊的data區的length
4 byte  Type 塊的類型
length byte Data 塊的data
4 byte  CRC 塊類型和data兩個區共length+4字節的CRC校驗和
我們感興趣的塊是調色板塊,類型區的內容是'P'、'L'、'T'、'E'四個字節,data區是所有顏色按照0xRRGGBB的格式排列,length區的值是顏色數*3。OK,基礎知識準備完畢。(CRC校驗和的算法和png結構的詳細信息可參考[url]http://www.w3.org/TR/PNG-Structure.html[/url]
接下來設計我們的超級牛X的PalettedImage類,首先提供兩個工廠方法,一個通過文件名從包中創建圖片,另一個直接從byte數組中創建。創建後馬上執行analyze方法,得到顏色數、調色板偏移、CRC校驗碼偏移等值(針對一張圖片這些值是不變的)。以後就可以用setColor替換某種顏色或者用setPalette替換整個調色板的所有顏色值了。每次替換顏色後都記得要重新生成正確的CRC校驗和,並重新創建圖片。
這個類的好處在於不必攜帶極多的圖片資源,而只需要一張圖片和若干套調色板信息就好了。缺點在於它會佔用一個圖片的2倍的內存(imgData數組和image對象),不過你可以在得到新Image後就把PalettedImage釋放掉。
附帶一個簡單的示例(點此下載),按5鍵ken就會換衣服。
這裏是效果圖:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章