白黒羊

Photoshopでスクリプトを使って画像を分割する

機械学習でのフォント作成にあたって、教師データ作成のために一枚の紙に8×12個の文字を書いてからスキャンするということをしているのですが、一個一個を分割して保存するのが面倒だったのでJavaScriptで自動化することにしました。

Photoshop でのスクリプティング

JavaScriptのスクリプトを作る

まずはJavaScriptでこのように書きます。
したいことが画像の等サイズ分割保存ならば、数字さえ変えればほとんどコピペで使えるはずです。

blockWidth = 235; //  pixel
blockHeight = 235; //  pixel
preferences.rulerUnits = Units.PIXELS; // 単位の設定
jpgOpt = new JPEGSaveOptions();
jpgOpt.quality = 12;
jpgOpt.embedColorProfile = false;
folderObj = Folder.selectDialog("保存フォルダを選択してください");
if (folderObj)
{
  docW = activeDocument.width.value;
  docH = activeDocument.height.value;
  n = prompt("開始番号",0);
  start_num = eval(n);
  countY = 0;
  for(y=0; y<docH; y+=blockHeight)
  {
    countX = 0;
    for (x=0; x<docW; x+=blockWidth)
    {
      selReg = [[x,y],[x+blockWidth,y],[x+blockWidth,y+blockHeight],[x,y+blockHeight]];
      activeDocument.selection.select(selReg);
      activeDocument.selection.copy();
      filename = folderObj+"/"+('0000' + (countX+countY*8+start_num)).slice(-4)+".jpg";
      fileObj = new File(filename); // 元ファイルを開く
      open(fileObj);
      activeDocument.selection.select([[0,0],[blockWidth,0],[blockWidth,blockHeight],[0,blockHeight]])
      activeDocument.paste(false);
      activeDocument.mergeVisibleLayers();
      activeDocument.saveAs(fileObj, jpgOpt, true, Extension.LOWERCASE);
      activeDocument.close(SaveOptions.DONOTSAVECHANGES);
      countX++;
    }
    countY++;
  }
}

書いたらこのコードを保存します。
保存先は「C:\Program Files\Adobe\Adobe Photoshop CC 2019\Presets\Scripts」の中身とかでしょうか。
私はこの「Scripts」フォルダに「My Scripts」みたいなフォルダを作ってその中に保存しました。
この中には色々なスクリプトが保存されているので、自分で何か書きたいときにも参考にできそうです。

以下にはコードの内容をメモしてありますが、改変するときに困る以外には見なくて大丈夫です。
コード見て分かる以上のことは書いてないです。

1、2行目で切り取るサイズを指定しています。
3行目で単位の設定。今回は「pixel」にしました。
Jpg形式で保存するので、4~6行目ではその設定をしています。
今回は、「quality」(画質。1~12の範囲で指定)、「embedColorProfile」(カラープロファイルを埋め込むかどうか。trueかfalse)の指定だけをしましたが、それ以外にも「formatOptions」で最適化ベースライン(FormatOptions.OPTIMIZEDBASELINE)、プログレッシブ(FormatOptions.PROGRESSIVE)、標準化ベースライン(FormatOptions.STANDARDBASELINE)を選ぶこともできます。
ちなみに、ベースラインは画像が上のほうから徐々に表示されていく方式でプログレッシブは最初は画像を荒く表示し徐々に鮮明な画質になっていくという方式です。プログレッシブの方がやや軽くなるらしい。
また、プログレッシブを選択した上で、「scans」で3~5の数値を指定すると完全に表示されるまでの段階の数を決めることができます。

7行目では、保存先のフォルダーを選択させるダイアログを表示させています。
保存先のフォルダーが選択されると、8行目以降が実行されます。
10行目、11行目で画像の幅を読み込ませて、12行目でファイル名につける番号を何番からにするのかを聞いています。
これを指定できないと、前回作った分割画像と同じ名前をつけることになってしまうので。
13行目で指定した番号をstart_numにセット。
14行目~19行目あたりでは、順々に分割して保存していくための二重forループを始めています。
20行目のselRegに分割画像の端点の座標を反時計回りに与えます。
21行目でその範囲を選択、22行目でコピー。
23行目で名前を設定して24行目で作成、25行目で開きます。
26行目で全範囲を選択して、27行目で貼り付け、28行目でレイヤーを統合しています。
29行目で名前をつけて保存して、30行目で閉じます。

と、まあこれだけの作業が一括でできるので便利!

JavaScriptは太古の昔にFlash系のゲーム作るときにちょっと触ってそれっきり、って感じだった気がしますが調べると日本語情報が色々でてきて分かりやすかったです。

スクリプトを走らせる

「ファイル」>「スクリプト」>「参照」を選択

この画像のように、「ファイル」から「スクリプト」を選び、「参照」から先ほど保存したJavaScriptファイルを選択します。
そこからは自動的に動くので、指示に従って数字と保存先フォルダーを教えてあげるだけです。簡単!

文字を手書きする

ここから先は完全に自分用のメモですが、上記の設定でちょうどよくなる手書き文字の設定を書いておきます。
A4 5ミリ方眼のレポートパッドに、

ぺんてるのサインペンで、

文字を横8個×縦12個で敷き詰めていくと良さそうです。

参考

クリエイター手抜きプロジェクト (Photoshop編)

「JPEG」ベースライン(標準)、ベースライン(最適化)、プログレッシブの違い _ Mechalog