Write and Run

it's a simple way, but the only way.

Photoshopのレイヤー構造をそのままフォルダ構造に落としこんでPNG出力する素敵なスクリプト書いた

こんにちは KOBA789 です。今日は Photoshop で表情差分とかが大量にある PSD から PNG にガシガシ書き出したい時に便利なスクリプトをご紹介します。自分は Photoshop を持っていないのですが、個人案件でキャラ絵を展開するときにあったほうが便利そうだったので作りました。

var flag = confirm("ok?");
if (flag) {
  var docObj = activeDocument;
  var folderPath = docObj.path + "/" + docObj.name.substring(0, String(docObj.name).length - 4);
  var folderObj = new Folder(folderPath);
  folderObj.create();
  hideLayer(docObj);
  makePNG(docObj, folderPath);
  alert('done');
} else {
  alert('canceled');
}

function hideLayer (obj) {
  for (var i = 0; i < obj.artLayers.length; i ++) {
    obj.artLayers[i].visible = false;
  }
  for (var i = 0; i < obj.layerSets.length; i ++) {
    obj.layerSets[i].visible = true;
    hideLayer(obj.layerSets[i]);
  }
}

function makePNG (obj, path) {
  var layerNum = 0;
  for (var i = 0; i < obj.artLayers.length; i ++) {
    var docObj = activeDocument;
    obj.artLayers[i].visible = true;
    var file = new File(path + '/' + ('0' + String(layerNum ++)).slice(-2) + '_' + obj.artLayers[i].name + '.png');
    var option = new PNGSaveOptions();
    option.interlaced = false;
    docObj.saveAs(file, option, true, Extension.LOWERCASE);
    obj.artLayers[i].visible = false;
  }
  for (var i = 0; i < obj.layerSets.length; i ++) {
    var folderPath = path + '/' + ('0' + String(layerNum ++)).slice(-2) + '_' + obj.layerSets[i].name;
    var folderObj = new Folder(folderPath);
    folderObj.create();
    makePNG(obj.layerSets[i], folderPath);
  }
}

Photoshop の JS がよくわからんのでいろんなとこからいろいろ拾ってきたので汚いですが、良い感じに出力されます。連番がファイル名の頭についてレイヤー順序も保持されるので最強です。

f:id:koba789:20120501194901p:plain

コピペっぽいのが混じってるのでライセンス的に怪しいですが、知識を共有するのは大切だと思うので何か問題が報告されない限りここに置いておきます。