iOS開發:使用大圖+腳本,生成各種size的app icon和圖片素材

美術UI在公司是寶貴的資源,集各種項目寵愛于一身。為了努力完成好老板的進度需求,不給UI添麻煩。程序員開始忙活了。

在iOS里面,我們使用image assert來管理素材和app icon。為什么呢?因為方便,按照image assert要求的尺寸拖進去就好了。

ImageAssert適配各種尺寸

什么?UI只給你大圖,壓縮啥的自己搞。What the f**k!胸中無限感慨,我們是光榮偉大的Coder乜!come on!

1, 縮放圖片到指定尺寸。

用過PS么?用過美圖秀秀么?
好吧,沒有我也不勉強你,估計你也不會美顏、磨皮、消下巴、變大眼睛、美白吧!用的很熟練,你也不用看這篇東東了。
來吧,在Mac下給你一個神器sips,一個命令行工具,哈哈!sips這玩意是命令行處理圖片大小的,可以方便的用來修改圖片的各種尺寸。

高分辨率的button圖片素材

如果一個圖片button.png為256*256的,壓成@2x和@1x的話,按照2/3、1/3來壓縮得到171*171 和 85*85的素材。那么sips命令就是這樣使用(在shell命令行里):

# cp button.png button@3x.png
# sips -z 171 171 button.png --out button@2x.png
# sips -z 85 85 button.png --out button.png

這樣輸出,在當前文件夾下,你可以得到獲得 button.png\button@2x.png \buttong@3x.png三個素材圖片了,把它們拖到image assert里面來管理吧。在iOS界面Storyboard中可以直接使用button圖片,配合AutoLayout自動適配不同尺寸設備。

@2x和@1x的button-assert

sips的詳細用法請打開Mac的命令行終端:

//執行sips -help查看詳細用法
# sips –help

2,獲取圖片尺寸,等比例縮放圖片。

上面我們是預先知道了圖片的寬和高,然后自己進行了寬和高乘以2/3、1/3的處理,但是如果圖片素材很多,你總不可能一個一個的搞幾天啊,這不科學。我們是光榮偉大的Coder乜!嗯嗯,sips會給我們答案的,使用下面兩行命令分別獲取圖片素材的寬和高:

sips -g pixelHeight button.png | awk -F: '{print $2}'
sips -g pixelWidth button.png | awk -F: '{print $2}'

請實際將這兩行代碼運行一下,看看是否得到預期結果。sips輸出寬高,然后awk命令把值提取出來。具體的參數含義請查一下手冊。
接下來,我們需要地方來存儲這兩個變量,并計算出它們乘以2/3、1/3的結果。因此,我們來寫個Shell腳本程序吧!
Shell腳本,你就理解能把命令行程序打包組合執行的這么一個東東吧。
在Shell里面定義一個函數,命名為ScalePic

ScalePic () {
    
    # 1 獲取圖片的高和寬
    imageHeight=`sips -g pixelHeight $1 | awk -F: '{print $2}'`
    imageWidth=`sips -g pixelWidth $1 | awk -F: '{print $2}'`
    height=`echo $imageHeight`
    width=`echo $imageWidth`
 
    # 2 獲取壓縮2/3和1/3后的尺寸
    height2x=$(($height*2/3))
    width2x=$(($width*2/3))
 
    height1x=$(($height/3))
    width1x=$(($width/3))
 
    # 3 存放輸入文件名,并生成@2x和@3x后綴文件名
    imageFile=$1
    fileName2x=${imageFile/\.png/@2x\.png}
    fileName3x=${imageFile/\.png/@3x\.png}
 
    # 4 拷貝并進行壓縮
    cp $1 $fileName3x
    sips -z $height2x $width2x $1 --out $fileName2x
    sips -z $height1x $width1x $1
}

接下來我們如何在Shell腳本里面調用這個函數呢?我們首先來確定一下我們可愛尊貴的UI MM&GG給我們素材。都統統放在了一個文件夾里,有11.png、112.png 等感人肺腑的命名文件命名,好了。我們默默的把文件名改好。
打開命令行,進入跟這個文件夾一級的文件夾,將Shell腳本放入。Shell腳本是這個樣子滴:

#!/bin/sh
 
# 0 進入素材文件夾
cd $1
 
# 1 遍歷當前文件夾下的所有文件,即所有圖片素材了。
for file in ./*
do 
    # 2 獲取圖片的文件名,并生成 “文件名.imageset”文件夾,方便下一步處理
    imageFile=$(basename $file)
    imageDir=${imageFile/\.png/\.imageset}
    mkdir $imageDir
 
    # 3 將圖片拷貝入“文件名.imageset”文件夾,并進入該文件夾
    cp $imageFile $imageDir/
    cd $imageDir
 
    # 4 執行ScalePic函數,將圖片文件名作為參數。最后處理完后,退回上一級目錄
    ScalePic $imageFile
    cd ..
done
 
cd ..

大家可以試著運行一下Shell腳本,腳本名字imagesetGenerator.sh,素材圖片的文件夾為imageiphone,命令行下執行腳本:

./imagesetGenerator.sh imageiphone

哇塞!一瞬間,所有的大小尺寸的圖片都生成了,并在各自的文件夾下了!wonderful!

3,真的要手動把所有圖片拖入到ImageSet里面嗎?

手動生成了所有圖片素材后,你以為工作就結束了嗎?試試將所有的素材拖入到ImageSet里面吧,工作是痛苦而乏味的。我們能這樣弱嗎?答案明顯是NO,我們是光榮偉大的Coder乜!
首先,在Xcode里面右鍵,打開一個ImageSet文件夾。

在Finder中打開ImageSet-1024x482

如下圖所示,ImageSet文件夾都是以“.imageset”結尾的,里面包含三個圖像素材和一個“Contents.json”文件。

ImageSet結構

我們打開“Contents.json”文件,里面的結構如下:

{
  "images" : [
   {
      "idiom" : "universal",
      "scale" : "1x",
      "filename" : "btn_close.png"
   },
   {
      "idiom" : "universal",
      "scale" : "2x",
      "filename" : "btn_close@2x.png"
   },
   {
      "idiom" : "universal",
      "scale" : "3x",
      "filename" : "btn_close@3x.png"
   }
 ],
  "info" : {
     "version" : 1,
     "author" : "xcode"
 }
}

這是一個以JSON格式表述的素材管理格式。這個JSON文件的內容很容易看懂的,基本上就是1x,2x和3x對應的圖像文件名。因此我們就要生成這樣的一個Contents.json文件,并放入相應的有各種圖像素材的imageset文件夾里。
好,回到我們現在的工作階段。上一步2的腳本里面,我們已經把圖像的素材放入了.iamgeset文件夾里了,我們現在就差一個Contents.json描述文件了。繼續搞起!

contents () {
    imageFile=$1
    renameFile2x=${imageFile/\.png/@2x\.png}
    renameFile3x=${imageFile/\.png/@3x\.png}
 
    echo {  >> Contents.json
    echo "  \"images\"" : [>> Contents.json
    echo "   "{>> Contents.json
    echo "      \"idiom\"" : "\"universal\"",>> Contents.json
    echo "      \"scale\"" : "\"1x\"",>> Contents.json
    echo "      \"filename\"" : "\"$imageFile\"">> Contents.json
    echo "   "},>> Contents.json
    echo "   "{>> Contents.json
    echo "      \"idiom\"" : "\"universal\"",>> Contents.json
    echo "      \"scale\"" : "\"2x\"",>> Contents.json
    echo "      \"filename\"" : "\"$renameFile2x\"">> Contents.json
    echo "   "},>> Contents.json
    echo "   "{>> Contents.json
    echo "      \"idiom\"" : "\"universal\"",>> Contents.json
    echo "      \"scale\"" : "\"3x\"",>> Contents.json
    echo "      \"filename\"" : "\"$renameFile3x\"">> Contents.json
    echo "   "}>> Contents.json
    echo " "],>> Contents.json
    echo "  \"info\"" : {>> Contents.json
    echo "     \"version\"" : 1,>> Contents.json
    echo "     \"author\"" : "\"xcode\"">> Contents.json
    echo " "}>> Contents.json
    echo }>> Contents.json
 
}

contents函數,暴力的echo文本到Contents.json文件中去。
好了,最后的完成態的腳本應該是這個樣子滴:

#!/bin/sh
 
# 0 進入需要處理的素材文件夾
cd $1
 
# 1 遍歷當前文件夾下的所有文件,即所有圖片素材了。
for file in ./*
do 
    # 2 獲取圖片的文件名,并生成 “文件名.imageset”文件夾,方便下一步處理
    imageFile=$(basename $file)
    imageDir=${imageFile/\.png/\.imageset}
    mkdir $imageDir
 
    # 3 將圖片拷貝入“文件名.imageset”文件夾,并進入該文件夾
    cp $imageFile $imageDir/
    cd $imageDir
 
    # 4 執行ScalePic函數,將圖片文件名作為參數。
    #   執行Contents函數,生成描述文件Contents.json
    #   最后處理完后,退回上一級目錄
    ScalePic $imageFile
    Contents $imageFile
    cd ..
done
 
cd ..

執行后,得到所需要的文件素材,拖入XCode工程的Assets.xcassets文件夾中,就可以在項目中自動識別出來了。

完成的腳本在GitHub上,可以點擊獲取imagesetGenerator.sh

調用過程如下(可能簡書沒法顯示GIF,可以去我的博客站看看):

imageProcess.gif

4,彩蛋,AppIcon也能這么干!

ImageSet里面AppIcon里面需要匹配的尺寸更多,我們當然也可以輕松的解決。腳本在下面了,怎么用和理解當成作業留給大家了。

#!/bin/sh
 
IconWithSize() {
    #-Z 等比例按照給定尺寸縮放最長邊。
    sips -Z $1 icon.png --out icon_$1x$1.png
}
 
for size in  29 40 50 57 58 60 72 76 80 87 100 114 120 144 152 180
do
    IconWithSize $size
done

希望大家能夠利用工具簡化一切操作!我們是光榮偉大的Coder乜!以上。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容