🐇

手作業から解放!Photoshopでキャラバリエーションの作成を自動化する方法

2024/09/21に公開


腕の痛みによって生み出された記事...

はじめに

過去に私がキャラクターの表情差分をPNGで作ろうとした時、自動化の手引きが見つからなくて辛かったので、同じ思いをする人が減ってほしいという願いを込めて書きました。

スクリプトが分からなくてもツールで楽にPNGを作れるし、業務用に使う場合でも問題点と対策を載せています。スクリプトが必要になった場合でも時短になれるようにクイックスタートを用意しました。

こんな悩み?

次のような悩みを解決できる可能性があります。

  • キャラクターのPSDはあるけど、表情を切り替えて1つずつ画像を作るのが面倒くさい。
  • 複数のレイヤーを切り替えて画像を作るのが辛い。
  • PSDを渡されて「後はお願い!」と投げられて途方に暮れている。

これらの問題をPhotoshopで解決するにはどうすれば良いかを、状況ごとに記載します。

検証環境

  • Windows 11
  • Photoshop 25.11.0

【状況1】画像差分を一気に作りたい

レイヤーを1つずつオンオフして手動で画像を作っている場合は、次のツールを使うことを検討してください。自身で範囲選択したレイヤーを順番にオンオフして画像を作ってくれる高機能なツールです。

大体の状況はこちらで解決されると思います。
以降、こちらのツールを「レイヤーの書き出しツール」と記載します。

https://www.omusubi-tech.com/?p=160


皆が幸せになる未来

【状況2】切り替えたいレイヤーが多い

レイヤーカンプの使用を検討してみてください。予め切り替えるレイヤーを決めて登録できるような機能です。Photoshopの機能の話で、探すと分かりやすい記事がたくさん出てくると思いますので、当記事では省略します。

【状況3】画像のファイルサイズを小さくしたい

「レイヤーの書き出しツール」を使いたいけど、出力後の画像のファイルサイズを小さくしたい場合は、「レイヤーの書き出しツール」のスクリプトを直接編集するのが良いと思います。

次のようにSavePNGメソッドを書き換えましょう。この実装で作られる画像は、Photoshopの「PNGとしてクイック書き出し」とほぼ同じです。

LayerExporter.jsx
//================================================================================
// PNG形式で保存
function SavePNG(path) {
    var options = new ExportOptionsSaveForWeb();
    options.format = SaveDocumentType.PNG;
    options.PNG8 = false;
    options.optimized = false;
    options.quality = 100;
    var file = new File(path + ".png");
    activeDocument.exportDocument(file, ExportType.SAVEFORWEB, options);
}

【状況4】1クリックでなんとかしたい

「レイヤーの書き出しツール」を検討した結果、範囲選択する枚数が多かったり、階層が分かれていたり、作成を頻繁にする場合、もっと少ない手順でなんとかしてほしいと依頼されるかもしれません。

こういった状況ではスクリプトを作る必要がありますが、1から用意するのが負担と感じる方に向けて、レイヤーを切り替えながらPNG保存する実装と、要点をまとめたクイックスタートを用意しました。

クイックスタート

  1. SampleExportLayers.jsxをコピペ、またはダウンロードする。
  2. 6行目のレイヤーのグループを指定している箇所を、自身のPSDの内容に合わせて書き換える。ここで指定したグループ内のレイヤーを元に画像が作られます。[1]
  3. PhotoshopでPSDを開く。
  4. メニューバーから「ファイル/スクリプト/参照」を選び、作成したjsxを選択する。
  5. 画像が出力されたら完了です!あとは好きに編集してください。

https://github.com/flat-yr/photoshop-SampleExportLayers/blob/main/SampleExportLayers.jsx

おわり


おつかれ!良いレイヤーライフを!

脚注
  1. 書き換え例(1):表情/表情差分→.layerSets["表情"].layerSets["表情差分"].artLayers;
    書き換え例(2):キャラ名/表情/表情差分→.layerSets["キャラ名"].layerSets["表情"].layerSets["表情差分"].artLayers;
    たまにレイヤー名に空白が潜んでいる事もあるのでチェックする。 ↩︎

Discussion