SwiftでiOS用Appiconを一括でリサイズするコードを書いてみた。
・はじめに
iOSアプリを制作するにあたり、Appiconの必要枚数が非常に増えて面倒なので、一括で生成するツールを探してみました。
以下のサイトを発見しました。
・ Webサイトにてジェネレータの公開 App Icon Resizer
・ Sketchの利用 複数サイズのiOSアイコンを簡単に作成する
・ シェルスクリプトの利用 iOSアプリのアイコン作成手順
等です。
まあまあ、ありましたが、「そもそもプログラム言語であるSwift自身で生成できないだろうか?」という事で勉強のため作ってみました。
なお、playgroundで作成しております。
・必要な画像ファイルの種類
Xcode7.2にて対応デバイス増やそうとすると結構な数のアイコンが必要となります。
iPhoneとiPad用(iOS7.0 and Later)
iPhoneとiPad用(iOS6.1 and Prior)
・生成画像ファイルの命名規則
iPhoneとiPad用(iOS7.0 and Later)を例とした場合の命名規則
(1)に当てはめる画像のファイル名をicon29@2x.pngとしています。画像の(1)部分のスケールの記述は、2xとなり、2倍となります。また、(2)部分のサイズは、29ptと記述されているので、実際のサイズとしては、29ptの2x(倍)スケールで58pxとなります。デバイスに応じて当てはめられるスケールの違いをここで吸収してくれています。
・プログラムの手順を考えてみる
・ 配列にタプルで画像ファイル名と画像サイズを格納し、for〜inループにて配列の要素分、画像生成を繰り返させる。
・実行方法
ここでは、playgroundで作成します。例としてiOS用のアイコン画像(iPhoneとiPad用 iOS7.0 and Later)を生成させます。
1. 元となる、PNG画像ファイル(picture.pngと命名)を画像編集ソフトなどで作成し、playgroundのResoucesフォルダにドラッグ&ドロップします。(ページの最後にサンプルを用意しています。)画像の横縦のサイズは、iOS用であれば、最大サイズである180×180px以上のものを用意します。
2. プログラムをplaygroundのエディタエリアに貼り付けます。そうすると、Documentフォルダ内にPNG画像が自動的にリサイズされ保存されます。
3. 画像の保存先URLをコピーし、Finderから、移動->フォルダへ移動でURLをペーストで入力し、フォルダを開きます。保存先のURLの入力の際は、「file:///var/folders/〜」の「file://」は削除し、「/var/folders/〜」からペーストする必要があります。
4. 開いたフォルダ内に生成された画像があるのでデータをコピーして完了です。
・プログラム
import UIKit
//ファイル名の一部とアイコンの画像サイズをタプルにて記述し配列に格納。iPhoneとiPad用(iOS7.0 and Later用)
//配列内のタプルは、カンマを挟んで左側の項目が、ファイル名の一部になり、右側の項目は、生成される画像のサイズとなります。
let appIconIPhone = [("29@2x",58),("29@3x",87),("40@2x",80),("40@3x",120),("60@2x",120),("60@3x",180)] //iPhone用(iOS7.0 and Later)
let appIconIPad = [("29",29),("29@2x",58),("40",40),("40@2x",80),("76",76),("76@2x",152),("83.5@2x",167)] //iPad用(iOS7.0 and Later用)
let appIconIOS = appIconIPhone + appIconIPad //上記の配列の連結。つまり、iOS用。iPhoneとipad用で同じファイルを一部生成してしまうが、上書きされるので結局1枚しか生成されない。MacOX用は、別途記載。
let deviceName = appIconIOS //生成したいパターンごとに配列名を変更する。ここでは、iOS用を記述。
let iconName = "icon"//生成された画像ファイル名の先頭部分。自由に変更してもらって構わない。
//for〜in ループで配列の要素分処理を繰り返す。
for (iconNameSize,size) in deviceName { //deviceName配列のタプルに対して、それぞれ(iconNameSize,size)に代入。
//アイコンの変更サイズ
let resize = CGSize(width: size, height: size)
let image = UIImage(named: "picture.png") //Resouceフォルダに格納したPNG画像のファイルの名前。
//リサイズ用にUIImageを作成
UIGraphicsBeginImageContext(resize) //コンテキスト開始
image?.drawInRect(CGRectMake(0, 0, resize.width, resize.height)) //元(picture.png)の画像から、リサイズ用画像を生成。画像が白かったら、ファイルパスが間違っている可能性がある。
let resizeImage = UIGraphicsGetImageFromCurrentImageContext() //リサイズした画像をresizeImage変数に格納
UIGraphicsEndImageContext() //コンテキスト終了
let resizeImageData = UIImagePNGRepresentation(resizeImage) //resizeImageからPNG画像の生成しresizeImageDataに格納
//let resizeImageData = UIImageJPEGRepresentation(image, 1.0) //Jpegの生成も可能。ちなみにJpegは、圧縮率も変更できる。
//生成されたPNG画像が格納されているDocumentフォルダのURL
let URLs = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains:.UserDomainMask)
let docDirURL = URLs.first!//URLs内のデータを取り出し、docDirURLに格納
//PNG画像をDocumentフォルダに保存
let fileURL = docDirURL.URLByAppendingPathComponent(iconName + iconNameSize + ".png") //保存先のフォルダとファイル名を連結させファイルパスを生成
resizeImageData!.writeToURL(fileURL, atomically:true) //ファイルパスにPNG画像を保存する。
}
//画像の保存先URL
NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains:.UserDomainMask).first
・その他のアイコンのサイズ
その他のアイコンサイズを記載します。必要に応じて、deviceName(配列)に代入してください。
・ iPhone(iOS6.1 and Prior) 元画像は、144pt以上を用意
let appIconIPhone = [("29",29),("29@2x",58),("57",57),("57@2x",114)]
・ iPad用(iOS6.1 and Prior) 元画像は、114pt以上を用意
let appIconIPad = [("29",29),("29@2x",58),("50",50),("50@2x",100),("72",72),("72@2x",144)]
・ MacOS用(ALL) 元画像は、1024px以上を用意
let appIconOSX = [("16",16),("16@2x",32),("32",32),("32@2x",64),("128",128),("128@2x",256),("256",256),("256@2x",512),("512",512),("512@2x",1024)]
・テスト用画像ファイル
テスト用画像を作ってみました。テストの際には、picture.pngにリネームしご利用ください。
picture.png 180×180px