Featured image of post 【簡単マルチアイコン作成】SVGやPNGから様々なアイコンファイルをまとめて自動生成してくれる「icon-gen」をnpmでインストールして幸せになろう【使い方】

【簡単マルチアイコン作成】SVGやPNGから様々なアイコンファイルをまとめて自動生成してくれる「icon-gen」をnpmでインストールして幸せになろう【使い方】

2453文字

アイコン画像を作りたい

レトロなやり方はやめたい

Webサイト制作をしていると、ほぼ100%の確率faviconを作成することになると思うのですが、このfaviconの作成方法について、以外と確立されていないのが現状です。

イラストレーターで作ったり、無料のWebツールで作成したりと手段は様々ありますが、画質が荒くなったりサイズごとの画像を用意しないといけなかったり課題がたくさんです。

Electronでもアイコン画像が必要

最近のデスクトップアプリの開発でよく使われているElectronでも、アプリアイコンが必要となっています。

Electron自体はマルチプラットフォームのアプリなのでWindowsでもMacでも動くのですが、それぞれ別のアイコンファイルを作成する必要があり、これもそれぞれ作らないといけないのが手間ですね。orz

npmのicon-genを使えば一発でまとめて作成

そんなあなたにオススメなのが、icon-genです!

akabekobeko/npm-icon-gen

こちらを使えば、コマンドベース単一の画像ファイルからサクッと様々な形式のアイコン画像をまとめて作ることが出来ます。

マルチアイコンにも対応

さらに、このicon-genの強みとして、マルチアイコンの作成にも対応している点が挙げられます。

一つのSVGからコマンド一発でWindows/mac/ホームページのそれぞれのマルチアイコンを生成出来るのは最強すぎませんかね?!

手順

インストール

まずは今回使うicon-gen以下のコマンドでインストールしましょう。

コマンド
npm install icon-gen

以下のように依存パッケージ含めインストールが完了します。

実行ログ
└─┬ icon-gen@2.0.0
  ├─┬ del@3.0.0
  │ ├─┬ globby@6.1.0
  │ │ ├─┬ array-union@1.0.2
  │ │ │ └── array-uniq@1.0.3
  │ │ ├─┬ glob@7.1.3
  │ │ │ ├── fs.realpath@1.0.0
  │ │ │ ├─┬ inflight@1.0.6
  │ │ │ │ └── wrappy@1.0.2
  │ │ │ ├── inherits@2.0.3
  │ │ │ ├─┬ minimatch@3.0.4
  │ │ │ │ └─┬ brace-expansion@1.1.11
  │ │ │ │   ├── balanced-match@1.0.0
  │ │ │ │   └── concat-map@0.0.1
  │ │ │ ├── once@1.4.0
  │ │ │ └── path-is-absolute@1.0.1
  │ │ ├── object-assign@4.1.1
  │ │ ├── pify@2.3.0
  │ │ └─┬ pinkie-promise@2.0.1
  │ │   └── pinkie@2.0.4
  │ ├── is-path-cwd@1.0.0
  │ ├─┬ is-path-in-cwd@1.0.1
  │ │ └─┬ is-path-inside@1.0.1
  │ │   └── path-is-inside@1.0.2
  │ ├── p-map@1.2.0
  │ ├── pify@3.0.0
  │ └── rimraf@2.6.2
  ├─┬ mkdirp@0.5.1
  │ └── minimist@0.0.8
  ├── pngjs-nozlib@1.0.0
  ├─┬ svg2png@4.1.1
  │ ├── file-url@2.0.2
  │ ├─┬ phantomjs-prebuilt@2.1.16
  │ │ ├── es6-promise@4.2.5
  │ │ ├─┬ extract-zip@1.6.7
  │ │ │ ├─┬ concat-stream@1.6.2
  │ │ │ │ ├── buffer-from@1.1.1
  │ │ │ │ ├─┬ readable-stream@2.3.6
  │ │ │ │ │ ├── core-util-is@1.0.2
  │ │ │ │ │ ├── isarray@1.0.0
  │ │ │ │ │ ├── process-nextick-args@2.0.0
  │ │ │ │ │ ├── string_decoder@1.1.1
  │ │ │ │ │ └── util-deprecate@1.0.2
  │ │ │ │ └── typedarray@0.0.6
  │ │ │ ├─┬ debug@2.6.9
  │ │ │ │ └── ms@2.0.0
  │ │ │ └─┬ yauzl@2.4.1
  │ │ │   └─┬ fd-slicer@1.0.1
  │ │ │     └── pend@1.2.0
  │ │ ├─┬ fs-extra@1.0.0
  │ │ │ ├── graceful-fs@4.1.15
  │ │ │ ├── jsonfile@2.4.0
  │ │ │ └── klaw@1.3.1
  │ │ ├─┬ hasha@2.2.0
  │ │ │ └── is-stream@1.1.0
  │ │ ├── kew@0.7.0
  │ │ ├── progress@1.1.8
  │ │ ├─┬ request@2.88.0
  │ │ │ ├── aws-sign2@0.7.0
  │ │ │ ├── aws4@1.8.0
  │ │ │ ├── caseless@0.12.0
  │ │ │ ├─┬ combined-stream@1.0.7
  │ │ │ │ └── delayed-stream@1.0.0
  │ │ │ ├── extend@3.0.2
  │ │ │ ├── forever-agent@0.6.1
  │ │ │ ├─┬ form-data@2.3.3
  │ │ │ │ └── asynckit@0.4.0
  │ │ │ ├─┬ har-validator@5.1.3
  │ │ │ │ ├─┬ ajv@6.6.1
  │ │ │ │ │ ├── fast-deep-equal@2.0.1
  │ │ │ │ │ ├── fast-json-stable-stringify@2.0.0
  │ │ │ │ │ ├── json-schema-traverse@0.4.1
  │ │ │ │ │ └─┬ uri-js@4.2.2
  │ │ │ │ │   └── punycode@2.1.1
  │ │ │ │ └── har-schema@2.0.0
  │ │ │ ├─┬ http-signature@1.2.0
  │ │ │ │ ├── assert-plus@1.0.0
  │ │ │ │ ├─┬ jsprim@1.4.1
  │ │ │ │ │ ├── extsprintf@1.3.0
  │ │ │ │ │ ├── json-schema@0.2.3
  │ │ │ │ │ └── verror@1.10.0
  │ │ │ │ └─┬ sshpk@1.15.2
  │ │ │ │   ├── asn1@0.2.4
  │ │ │ │   ├── bcrypt-pbkdf@1.0.2
  │ │ │ │   ├── dashdash@1.14.1
  │ │ │ │   ├── ecc-jsbn@0.1.2
  │ │ │ │   ├── getpass@0.1.7
  │ │ │ │   ├── jsbn@0.1.1
  │ │ │ │   ├── safer-buffer@2.1.2
  │ │ │ │   └── tweetnacl@0.14.5
  │ │ │ ├── is-typedarray@1.0.0
  │ │ │ ├── isstream@0.1.2
  │ │ │ ├── json-stringify-safe@5.0.1
  │ │ │ ├─┬ mime-types@2.1.21
  │ │ │ │ └── mime-db@1.37.0
  │ │ │ ├── oauth-sign@0.9.0
  │ │ │ ├── performance-now@2.1.0
  │ │ │ ├── qs@6.5.2
  │ │ │ ├── safe-buffer@5.1.2
  │ │ │ ├─┬ tough-cookie@2.4.3
  │ │ │ │ ├── psl@1.1.29
  │ │ │ │ └── punycode@1.4.1
  │ │ │ └── tunnel-agent@0.6.0
  │ │ ├─┬ request-progress@2.0.1
  │ │ │ └── throttleit@1.0.0
  │ │ └─┬ which@1.3.1
  │ │   └── isexe@2.0.0
  │ ├── pn@1.1.0
  │ └─┬ yargs@6.6.0
  │   ├── camelcase@3.0.0
  │   ├─┬ cliui@3.2.0
  │   │ ├─┬ strip-ansi@3.0.1
  │   │ │ └── ansi-regex@2.1.1
  │   │ └── wrap-ansi@2.1.0
  │   ├── decamelize@1.2.0
  │   ├── get-caller-file@1.0.3
  │   ├─┬ os-locale@1.4.0
  │   │ └─┬ lcid@1.0.0
  │   │   └── invert-kv@1.0.0
  │   ├─┬ read-pkg-up@1.0.1
  │   │ ├─┬ find-up@1.1.2
  │   │ │ └── path-exists@2.1.0
  │   │ └─┬ read-pkg@1.1.0
  │   │   ├─┬ load-json-file@1.1.0
  │   │   │ ├─┬ parse-json@2.2.0
  │   │   │ │ └─┬ error-ex@1.3.2
  │   │   │ │   └── is-arrayish@0.2.1
  │   │   │ ├── pify@2.3.0
  │   │   │ └─┬ strip-bom@2.0.0
  │   │   │   └── is-utf8@0.2.1
  │   │   ├─┬ normalize-package-data@2.4.0
  │   │   │ ├── hosted-git-info@2.7.1
  │   │   │ ├─┬ is-builtin-module@1.0.0
  │   │   │ │ └── builtin-modules@1.1.1
  │   │   │ ├── semver@5.6.0
  │   │   │ └─┬ validate-npm-package-license@3.0.4
  │   │   │   ├─┬ spdx-correct@3.0.2
  │   │   │   │ └── spdx-license-ids@3.0.2
  │   │   │   └─┬ spdx-expression-parse@3.0.0
  │   │   │     └── spdx-exceptions@2.2.0
  │   │   └─┬ path-type@1.1.0
  │   │     └── pify@2.3.0
  │   ├── require-directory@2.1.1
  │   ├── require-main-filename@1.0.1
  │   ├── set-blocking@2.0.0
  │   ├─┬ string-width@1.0.2
  │   │ ├── code-point-at@1.1.0
  │   │ └─┬ is-fullwidth-code-point@1.0.0
  │   │   └── number-is-nan@1.0.1
  │   ├── which-module@1.0.0
  │   ├── y18n@3.2.1
  │   └── yargs-parser@4.2.1
  └── uuid@3.3.2

次に、以下のコマンドでpackage.jsonを作成しましょう。
対話は基本空欄でいいのでエンター連打でOKです。

npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (icon-gen)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/blogenist/tmp/work/javaScript/npm/icon-gen/package.json:

{
  "name": "icon-gen",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "icon-gen": "^2.0.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes

すると、以下のようにpackage.jsonが生成されます。

tree -L 1 .
.
├── node_modules # 省略
└── package.json

package.jsonの中身はこんな感じ。

package.json
{
  "name": "icon-gen",
  "version": "1.0.0",
  "description": "",
  "main": "script.js",
  "dependencies": {
    "icon-gen": "^2.0.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

スクリプトの準備

では、実際にicon-genを使うスクリプトを用意しましょう。
今回は同階層にあるblogenist_icon.svgと言うsvg画像から生成してみます。

まずは、script.jsと言うファイルを用意して以下の内容をコーディングしてください。
${XXX}は適時変えてください

./script.js
const icongen = require('icon-gen');

icongen('${iconにしたいファイル}', '${出力先ディレクトリ}', { report: true })
.then((results) => {
  console.log(results)
})
.catch((err) => {
  console.error(err)
});

出力先ディレクトリの作成

ここで指定したディレクトリが存在しない場合自動生成されないため、エラーが発生するので存在するディレクトリを指定する必要があります。

エラーログ
> icon-gen@1.0.0 start /Users/blogenist/tmp/work/javaScript/npm/icon-gen
> node script.js

Error: Output directory is not found.
    at GenerateIcon (/Users/blogenist/tmp/work/javaScript/npm/icon-gen/node_modules/icon-gen/dist/lib/icon-generator.js:209:27)
    at Object.<anonymous> (/Users/blogenist/tmp/work/javaScript/npm/icon-gen/script.js:3:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)

package.jsonに起動スクリプトの追加

次に、package.json起動スクリプトを定義します。

package.json
{
  "name": "icon-gen",
  "version": "1.0.0",
  "description": "",
  "main": "script.js",
  "dependencies": {
    "icon-gen": "^2.0.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1", // Json形式なのでカンマ(,)をお忘れなく
    "start": "node script.js" // 追加
  },
  "author": "",
  "license": "ISC"
}

実行

では、実際に以下のコマンドで実行をしてみましょう。

コマンド
npm run start

すると、以下のようなログが出始めて処理が開始されます。

実行ログ
> icon-gen@1.0.0 start /Users/blogenist/tmp/work/javaScript/npm/icon-gen
> node script.js

Icon generator from SVG:
  src: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/blogenist_icon.svg
  dir: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons
SVG to PNG:
  Create: /var/folders/qs/XXX/T/YYY/16.png
  Create: /var/folders/qs/XXX/T/YYY/24.png
  Create: /var/folders/qs/XXX/T/YYY/32.png
  Create: /var/folders/qs/XXX/T/YYY/48.png
  Create: /var/folders/qs/XXX/T/YYY/57.png
  Create: /var/folders/qs/XXX/T/YYY/64.png
  Create: /var/folders/qs/XXX/T/YYY/72.png
  Create: /var/folders/qs/XXX/T/YYY/96.png
  Create: /var/folders/qs/XXX/T/YYY/120.png
  Create: /var/folders/qs/XXX/T/YYY/128.png
  Create: /var/folders/qs/XXX/T/YYY/144.png
  Create: /var/folders/qs/XXX/T/YYY/152.png
  Create: /var/folders/qs/XXX/T/YYY/195.png
  Create: /var/folders/qs/XXX/T/YYY/228.png
  Create: /var/folders/qs/XXX/T/YYY/256.png
  Create: /var/folders/qs/XXX/T/YYY/512.png
  Create: /var/folders/qs/XXX/T/YYY/1024.png
ICNS:
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/app.icns
ICO:
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/app.ico
ICO:
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon.ico
Favicon:
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-32.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-57.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-72.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-96.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-120.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-128.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-144.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-152.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-195.png
  Create: /Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-228.png
[ '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/app.icns',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/app.ico',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon.ico',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-32.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-57.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-72.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-96.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-120.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-128.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-144.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-152.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-195.png',
  '/Users/blogenist/tmp/work/javaScript/npm/icon-gen/icons/favicon-228.png' ]

確認

iconsディレクトリの中を見ると一通りのアイコンファイルが生成されています。

tree icons
icons
├── app.icns
├── app.ico
├── favicon-120.png
├── favicon-128.png
├── favicon-144.png
├── favicon-152.png
├── favicon-195.png
├── favicon-228.png
├── favicon-32.png
├── favicon-57.png
├── favicon-72.png
├── favicon-96.png
└── favicon.ico

マルチアイコンにもしっかりなっていますね♪



終わりに

以上のように簡単にSVG画像から各種アイコン画像を生成することが出来ました。

もちろん、SVGだけでなくPNGからの生成も出来ますし、様々なオプションが備わっているので是非試してみてください♪