Help us understand the problem. What is going on with this article?

Node.jsでiOSのアプリに必要なアイコン画像をまとめて生成する

More than 5 years have passed since last update.

前置き

今朝、Node.jsで複数の画像ファイルをリサイズする方法を書いた時に

高解像度の画像データをベースにしてiPhone用のアイコンをまとめて出力する処理が今欲しい処理だったりします

と書きましたが、その後にiOSのアプリに必要なアイコンをコマンドラインで一発で生成する方法を見てたら割りと簡単に出来そうな気がしたので作りました。

想定してる読者イメージ

Node.jsを普段から使ってる人ではなく、Titanium で開発しててiOSのアプリに必要なアイコン画像をまとめて生成するのが面倒だなぁと思ってる人を割りとイメージしてます。

Titaniumで開発されてる方だと、最近は必然的にNode.js環境整えてるはずなので、その環境をうまく活用するとこういう面倒なこともサクッと処理できるようになって、本来の開発により専念できるんじゃないかと思います

自分の環境

  • OS X
    • 10.9.5
  • Node.js
    • v0.10.13
  • npm
    • 1.3.2

利用するための準備

以下簡単に準備をまとめます

プロジェクト用のフォルダを作る

現在ホームディレクトリにいるとして、ターミナル上で

mkdir iconexporter
cd iconexporter

という感じでプロジェクト用のフォルダを作っておきます

※ちょっとした注意点

GoogleグループのError: Invalid nameという2013年7月の情報ですが

Names must be all lowercase as of npm 1.3. This has been the rule for NEW packages for well over a year now

とあり、フォルダ名を必ず全部小文字にしないとハマります。(私、これで30分位無駄に時間使ったかも・・・)

ImageMagickインストール(インストールしてある方は読み飛ばしてください)

ドキュメントにも書いてありますが、このたぐいの画像処理なモジュールはImageMagickを利用して処理するようで、まずそれがインストールされてるのが前提とのこと。以前自分は別の処理するのにこれインストール済でしたが、Mac使っててbrew 経由でインストール出来る環境作ってるので

brew install imagemagick

として、少し時間かかりますが、インストール出来ます。

easyimageのインストール

npm init
npm install easyimage --save-dev

という感じでインストールしました。

画像が置いてあるディレクトリと出力先のディレクトリを準備

画像置いてる場所と別の場所にリサイズしたファイルを置きたかったので「img」[out」というディレクトリを作り、imgに変換元画像を置いたので、こんな感じになりました。

├── img
│   └── sample.png
├── index.js
├── node_modules
│   └── easyimage
├── out
└── package.json

ソースコード

index.jsの中身

var easyimg = require('easyimage'),
    fs = require('fs'),path = require('path'),
    imgPath = path.resolve(__dirname, 'img'),
    outPath = path.resolve(__dirname, 'out'),
    iconFileNameList,target,dist;

iconFileNameList = [
    {
        "iOS Device": "iPhone 4/4S/5/5C/5S/6 iPod touch 5th generation",
        "Purpose": "App icon",
        "Dimensions": "120",
        "DPI": "72",
        "Filename": "appicon-60@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPhone 6 Plus",
        "Purpose": "App Icon",
        "Dimensions": "180",
        "DPI": "72",
        "Filename": "appicon-60@3x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPad non-retina",
        "Purpose": "App icon",
        "Dimensions": "76",
        "DPI": "72",
        "Filename": "appicon-76.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPad retina",
        "Purpose": "App icon",
        "Dimensions": "152",
        "DPI": "72",
        "Filename": "appicon-76@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "Universal non-retina",
        "Purpose": "Spotlight",
        "Dimensions": "40",
        "DPI": "72",
        "Filename": "appicon-Small-40.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "Universal retina",
        "Purpose": "Spotlight",
        "Dimensions": "80",
        "DPI": "72",
        "Filename": "appicon-Small-40@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "Universal non-retina",
        "Purpose": "Settings",
        "Dimensions": "29",
        "DPI": "72",
        "Filename": "appicon-Small.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "Universal retina",
        "Purpose": "Settings",
        "Dimensions": "58",
        "DPI": "72",
        "Filename": "appicon-Small@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPhone 6 Plus",
        "Purpose": "Settings",
        "Dimensions": "87",
        "DPI": "72",
        "Filename": "appicon-Small@3x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPhone/iPod non-retina",
        "Purpose": "App icon",
        "Dimensions": "57",
        "DPI": "72",
        "Filename": "appicon.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPhone/iPod retina (iOS 6 and prior)",
        "Purpose": "App icon",
        "Dimensions": "114",
        "DPI": "72",
        "Filename": "appicon@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPad 1 & 2 (iOS 6 and prior)",
        "Purpose": "App icon",
        "Dimensions": "72",
        "DPI": "72",
        "Filename": "appicon-72.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPad 3 (iOS 6 and prior)",
        "Purpose": "App icon",
        "Dimensions": "144",
        "DPI": "72",
        "Filename": "appicon-72@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPhone/iPod non-retina",
        "Purpose": "Spotlight & settings",
        "Dimensions": "29",
        "DPI": "72",
        "Filename": "appicon-Small.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPhone/iPod retina (iOS 6 and prior)",
        "Purpose": "Spotlight & settings",
        "Dimensions": "58",
        "DPI": "72",
        "Filename": "appicon-Small@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPad 1 & 2 (iOS 6 and prior)",
        "Purpose": "Spotlight & settings",
        "Dimensions": "50",
        "DPI": "72",
        "Filename": "appicon-Small-50.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPad Retina (iOS 6 and prior)",
        "Purpose": "Spotlight",
        "Dimensions": "100",
        "DPI": "72",
        "Filename": "appicon-Small-50@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    },
    {
        "iOS Device": "iPad Retina (iOS 6 and prior)",
        "Purpose": "Settings",
        "Dimensions": "58",
        "DPI": "72",
        "Filename": "appicon-Small@2x.png",
        "Titanium folder location": "Resources or Resources/iphone"
    }

];
fs.readdir(imgPath, function(err, files){
  if (err) console.log(err);
    files.filter(function(file){
      var f, _i, _len;

      for (_i = 0, _len = iconFileNameList.length; _i < _len; _i++) {
        f = iconFileNameList[_i];
        target = imgPath + "/" + file;
        dist = outPath + "/" + f.Filename;
        easyimg.resize({
            src:target,
            dst:dist,
            width:f.Dimensions
        }, function(err, image) {
            if (err) throw err;
            console.log('Resized ' + image.width + ' x ' + image.height);
        });

      }      

    });

});

生成するアイコン画像の解像度とファイル名について

Titaniumでアプリを作っててiOSのアプリに必要なアイコン画像がまとめてほしくなったというすごく個人的な事情もあって、生成するアイコン画像の解像度とファイル名についてはTitaniumの公式サイトのIcons and Splash Screensにある一覧情報をベースにして作ってます。

実行する

ターミナル上で

node ./index.js

とします。マシンスペック次第ですがすぐに終わってしまうと思いますがoutフォルダにはこんな感じで意図通りのものができてるはずです

.
├── img
│   └── sample.png
├── index.js
├── node_modules
│   └── easyimage
├── out
│   ├── appicon-60@2x.png
│   ├── appicon-60@3x.png
│   ├── appicon-72.png
│   ├── appicon-72@2x.png
│   ├── appicon-76.png
│   ├── appicon-76@2x.png
│   ├── appicon-Small-40.png
│   ├── appicon-Small-40@2x.png
│   ├── appicon-Small-50.png
│   ├── appicon-Small-50@2x.png
│   ├── appicon-Small.png
│   ├── appicon-Small@2x.png
│   ├── appicon-Small@3x.png
│   ├── appicon.png
│   └── appicon@2x.png
└── package.json
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした