1. 程式人生 > >八、TexturePacker命令列壓縮圖片

八、TexturePacker命令列壓縮圖片

 今天天氣很好,不適合上班。但是我還是來了。(我真是太敬業了=.=!).每次跟你們說知識之前還來這麼一句自誇的話。真是難為你們了,好了下面進入正題

在Command Line中使用TexturePacker
2013-12-12
TexturePacker是一個非常好用的小圖合併工具,介紹它的文章非常多,多數都是使用GUI工具的,但是:

如果原始圖片發生了改變,我們就需要重新手動拼接一下,麻煩.
使用GUI介面非常不高階,我高大猿族絕對首選使用Command Line啊.
安裝TexturePacker會附帶一個command line工具,讓我們一起學習一下如何使用吧.
環境搭建

我一般首選在Windows下開發(不要打我),這裡就只講Windows環境的配置

1.先去這裡下載安裝檔案,完成後一路無腦下一步,OK.

2.大家在C:\Program Files\TexturePacker\bin目錄下可以看到兩個exe檔案,TexturePacker.exe和TexturePackerGUI.exe,前者是命令列工具,後者是GUI工具.

3.預設TexturePacker是沒有加到環境變數中的,我們需要手動來,右鍵點選計算機->屬性->高階系統設定->環境變數,找到PATH後將C:\Program Files\TexturePacker\bin新增到末尾,注意要在前面加;.

4.執行cmd,輸入TexturePacker大家應該能夠看到下面的內容:

如果不能的話請檢查拼寫和第2步.大家可以仔細閱讀一下內容,寫的十分詳細,用過TexturePacker的話基本上都能對應起來.

小試牛刀

你過你看完打印出的資訊的話可以發下末尾部分有三個示例,如下:

看起啦十分簡單,讓我們試一下吧,感謝微博小夥伴@sosoayaen發現的小祕密,使得我們可以快速的在任意位置開啟命令列.找一個有這一堆圖片的資料夾的上層目錄,按住Shift點選右鍵,會發現一個選單項在當前目錄開啟命令列,開啟後按照示例輸入TexturePacker 001/*.png,然後如示例說的:

creates out.plist and out.png from all png files in assets
trimming all files and creating a texture with max. 2048x2048px

實際情況卻不完全是這樣的,你可能會得到這樣的錯誤:

臥槽,這是什麼情況啊,明明就是按照官方的示例來的嘛,google完全沒有任何答案啊,經過一番痛苦的實驗後,終於發現了原因所在,這裡不能輸入:


TexturePacker 001/*.png

而應該是這個樣子:


TexturePacker 001

這個問題可能是由於我使用的版本太舊或使用Windows導致的,如果你沒有遇到,那麼最好!

引數詳解

本想著把所有引數都講一遍,寫到一半發現臥槽太多了,而且好些都用不到,這裡挑一些常用的分析下,以下內容都有進行測試,還是比較準確的,如果有問題,歡迎指出.
注:

選項含有<…>的選項表示含有引數需要填寫.
粗體表示比較重要的選項.
輸出

—sheet
+生成的圖片名,支援png,jpg,pvr,pvr.czz,pvr.gz格式
+示例:–sheet out.png

—data

生成的plist檔名
示例:–data out.plist
—format

生成的plist格式,我們使用cocos2d格式
示例:–format cocos2d
注:其他支援格式見下圖:

—auto-sd

自動生成sd資源
示例:–auto-sd
注:這個要注意一點,如果要使用這個引數,你輸入的sheet和data名必須含有-hd或@2x,TP會自動生成不帶字尾的sd資料.
—texturepath

在生成的sheet檔案的路徑前加你
示例:–texturepath image/tower 這樣在plist檔案中realTextureFileName的值為image/tower/out.png
注:這個引數主要用在當你的圖片與plist檔案不再同一個目錄時使用,不會改變out.png的目錄
—trim-sprite-name

剪裁掉拼接圖片的字尾名
示例:–trim-sprite-name 這樣在plist檔案中001.png會變成001
注:是剪裁用來拼接的檔案而不是生成檔案,如果你的資源管理類似於android那樣,使用圖片時不加字尾名,那麼打包時可以使用這個選項
—replace =

按照原文的翻譯是使用替換掉拼接圖片的檔名中正則表示式匹配的字串
臥槽,正則表示式啊一聽就尼瑪高大強啊,可惜老夫不會啊,怎麼辦呢?回家去翻翻金瓶梅改天告訴大家.
這個TM太有用了,後面我遇到的那個問題,用這個來解決最好不過了
—ignore-files

按照原文的翻譯是忽略所有滿足給定條件的圖片(可以使用時間作為條件),你可以使用*或?,但在使用bash時應避免使用萬用字元.
尺寸

先上一張cocos2d-x支援的最大圖片尺寸:

還有官方的這句話:

For the developers, if you want to cross platforms and run your games smoothly, you should keep your texture size less than 1024*1024, that is the lowest restriction for most machines.

—width/—height

兩個引數,放在一塊說了,設定輸出圖片的寬度/高度
示例:–width 100 –height 100
注:這個值設定的大了無所謂,會產生空白區域,但是如果太小,就會報錯:

error: Could not fit all sprites into the sprite sheet.
—max-width/—max-height/—max-size

設定輸出圖片的最大寬度/高度/尺寸
示例:–max-width 1024 –max-height 1024 前面兩個等價於後面 –max-size 1024
注:
1.和上面兩個引數的區別在於告訴TP實際值別超過這個值就OK,而上邊那兩個引數告訴TP實際值一定是這個.
2.預設值為2048
3.如果實際值大於設定的最大值會產生錯誤:
1
error: Sprite sheet size is too small.
—allow-free-size

允許輸出圖片不是2的冪,以最小尺寸輸出
示例:–allow-free-size
注:這個一般開啟,cocos2d-x2.0開始就已經支援圖片不是2的冪了
間距和旋轉

—shape-padding

圖塊之間縫隙的寬度,預設值是2
示例:–shape-padding 100
—border-padding

可以理解為邊框的寬度,預設值為2
示例:–border-padding 100
—padding

間距,這個引數等價於上面兩個引數同時同時作用
示例:–padding 100
注:如果沒有開啟–allow-free-size可能和你想象的不太一樣
—inner-padding

試了一下,這個引數的作用應該是給每個sprite的周圍加一個邊框,預設值為0
示例:–inner-padding 100
注:上面的這幾個引數作用都不是很大
—enable-rotation/diable-rotation

開啟/關閉旋轉,預設值和輸出的格式有關係,cococ2d格式預設enable
示例–enable-rotation –diable-rotation
注:這個很好理解,為了排版更密集些,有的圖片會被旋轉
—trim/no-trim

剪裁圖片,即移除圖片周圍的透明畫素,保留原始尺寸,預設開啟
示例:–trim no-trim
注:這個要格外注意一下,這個引數略微有些問題,如果沒有了解帶來的後果的話還是使用–no-trim更安全些,我會在後面的仔細講一下.
—crop

與上面的一條類似,移除圖片四周的透明畫素,不保留原始尺寸,儲存為一張更小的圖片
示例:–crop
注:同上,要小心使用,儘量不在這裡使用,而是改為前期用其它工具處理
—trim-threshold

與Trim類似,只是這個選項有一個引數,表示剪裁掉alpha值小於這個引數的畫素,取值0~255,預設為0.
示例:–trim-threshold
—disable-auto-alias

關閉自動命名,什麼意思呢?TP在打包時會自動識別相同的圖片,最終在大圖裡只會保留一張,這樣會更加的節省資源,這個引數將會關閉這個功能
示例:–disable-auto-alias
注:這樣引數還是不要設定的好
其他常用選項

—opt

設定輸出圖片的畫素格式 一般預設RGBA8888
示例:–opt RGB444
注:這個選項一般不做更改,如果想壓縮資源體積的話,可以改為RGBA4444這樣圖片可以減小一半的體積.具體大家可以看下面這張圖:

常見問題

錯誤: error: Error in sprite: .png: Failed to load image!
解決方案: 去掉目標路徑末尾的.png試試.

錯誤: error: Could not fit all sprites into the sprite sheet.
解決方案:
1.檢視有無設定–width or –height,這個錯誤通常是由於輸出圖片的尺寸太小導致的.
2.檢視有無–max-width/–max-height/–max-size,沒有的話加上,有的話將引數值改大一些.

錯誤: error: Sprite sheet size is too small.
解決方案:參見上個錯誤中的解決方案2,–max-width/–max-height/–max-size預設值為2048,試著改成4096試試,如果解決了,不要高興,因為大多數移動裝置都不支援這個尺寸,可以考慮分開打包.

錯誤: error: Unknown argument —XXX - please check parameters or visit http://www.texturepacker.com for newer version
解決方案: 檢查XXX的拼寫是否正確

問題: 程式中獲得圖片的尺寸與打包前不一致
解決方案: 檢查引數是否含有–crop,有的話刪除,有沒有–no-trim,沒有的話加上.

後記

講了那麼多引數,其實常用的沒有幾個,下面這個是我最終使用的命令:


TexturePacker --sheet out.png --data out.plist --allow-free-size --no-trim --max-size 1024 --format cocos2d animation

給大家提供一個windows下面的bat打圖的指令碼,記得先把TexturePacker配到Path路徑下

for /d %%s in (*) do (
TexturePacker --format cocos2d --data ../BuildAnimation/%%s.plist --texture-format png --sheet ../BuildAnimation/%%s.png --premultiply-alpha --opt RGBA8888 --dither-none-nn --max-width 2048 --max-height 2048 --size-constraints AnySize --pack-mode Best --scale 1 --scale-mode Smooth --algorithm MaxRects --maxrects-heuristics Best --border-padding 0 --shape-padding 0 --inner-padding 0 --extrude 0 --enable-rotation --trim-mode Trim --trim-threshold 1 %%s
)
cmd

最近做專案又發現一個問題,就是不能打多個圖的,今天瞅了瞅文件發現了–multipack 但是要在檔名後面加一個起始的識別符號{n}

for /d %%s in (*) do (
TexturePacker --multipack --format cocos2d --data ../BuildAnimation/%%s{n}.plist --texture-format png --sheet ../BuildAnimation/%%s{n}.png --premultiply-alpha --opt RGBA8888 --dither-none-nn --max-width 2048 --max-height 2048 --size-constraints AnySize --pack-mode Best --scale 1 --scale-mode Smooth --algorithm MaxRects --maxrects-heuristics Best --border-padding 0 --shape-padding 0 --inner-padding 0 --extrude 0 --enable-rotation --trim-mode Trim --trim-threshold 1 %%s
)
cmd

文章到這裡就要結束了,但其實還沒有完,–trim到底為什麼不建議使用?使用了會發生什麼問題?它和–crop的具體區別在哪裡?plist檔案中frame的路徑和其他plist的重複了怎麼辦?程式中怎麼做才能做到打包和不打包的差異最小化?金瓶梅你什麼時候看完?