ChatGPTを使ってPhotoshopのスクリプトを書いてみました

こんにちは!Rhinoです。
今回はChatGPTを使ってPhotoshopのスクリプトを書いてみましたので、ご紹介したいと思います。
但しAIで作成したものですので、ご利用の際には十分にご注意頂くことをお願い申し上げます。

今回作成したのは複数のレイヤーを選択した場合、それらのレイヤーマスクの選択範囲を統合するスクリプトになります。
ChatGPTだけではエラーが多発しましたので、必要に応じて人の手で修正する必要がありましたが、ゼロから記述することに比べると段違いで早いと感じました。
非常に便利なサービスが提供されるようになりましたね。

#target photoshop
$.level = 0; // デバッグレベルの設定

/**
 * 指定したレイヤー名でレイヤーを選択します。
 * @param {string} layerName - 選択するレイヤーの名前
 */
function selectLayerByName(layerName) {
  try {
    var actionDescriptor = new ActionDescriptor();
    var layerReference = new ActionReference();
    layerReference.putName(charIDToTypeID("Lyr "), layerName);
    actionDescriptor.putReference(charIDToTypeID("null"), layerReference);
    executeAction(charIDToTypeID("slct"), actionDescriptor, DialogModes.NO);
  } catch (e) {
    alert("レイヤーの選択中にエラーが発生しました:" + e);
  }
}

/**
 * 選択したレイヤーのレイヤーマスクの選択範囲を読み込みます。
 */
function loadLayerMaskSelection() {
  try {
    var actionDescriptor = new ActionDescriptor();
    var nullReference = new ActionReference();
    nullReference.putProperty(charIDToTypeID("Chnl"), charIDToTypeID("fsel"));
    actionDescriptor.putReference(charIDToTypeID("null"), nullReference);
    var targetReference = new ActionReference();
    targetReference.putEnumerated(charIDToTypeID("Chnl"), charIDToTypeID("Chnl"), charIDToTypeID("Msk "));
    actionDescriptor.putReference(charIDToTypeID("T   "), targetReference);

    // "setd" コマンドを実行して選択範囲を読み込む
    var setdCommandID = charIDToTypeID("setd");
    executeAction(setdCommandID, actionDescriptor, DialogModes.NO);
  } catch (e) {
    alert("エラーが発生しました:" + e);
  }
}

/**
 * 指定したレイヤー名のレイヤーマスクに選択範囲を追加します。
 * @param {string} layerName - 選択範囲を追加するレイヤーの名前
 */
function addSelectionToMask(layerName) {
  try {
    var addCommandID = charIDToTypeID("Add ");
    var addDescriptor = new ActionDescriptor();
    var nullReference = new ActionReference();
    var channelID = charIDToTypeID("Chnl");
    nullReference.putEnumerated(channelID, channelID, charIDToTypeID("Msk "));
    addDescriptor.putReference(charIDToTypeID("null"), nullReference);
    var targetReference = new ActionReference();
    targetReference.putName(channelID, layerName);
    addDescriptor.putReference(charIDToTypeID("T   "), targetReference);
    executeAction(addCommandID, addDescriptor, DialogModes.NO);
  } catch (e) {
    alert("エラーが発生しました:" + e);
  }
}

/**
 * 選択した複数のレイヤーのレイヤーマスクの選択範囲を読み込みます。
 */
function loadLayerMaskSelectionForMultipleLayers() {
  try {
    var doc = app.activeDocument;
    var ref = new ActionReference();
    ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));

    var desc = executeActionGet(ref);
    var targetLayers = desc.getList(stringIDToTypeID("targetLayers"));

    // 選択したレイヤーの数を取得
    var layerCount = targetLayers.count;

    // 選択したレイヤーを1つずつ処理
    for (var i = 0; i < layerCount; i++) {
      var layerReference = targetLayers.getReference(i);
      var layerDesc = executeActionGet(layerReference);
      var layerID = layerDesc.getInteger(stringIDToTypeID("layerID"));

      // レイヤーの名前を取得
      var layerRef = new ActionReference();
      layerRef.putIdentifier(charIDToTypeID("Lyr "), layerID);
      var layerDesc2 = executeActionGet(layerRef);
      var layerName = layerDesc2.getString(charIDToTypeID("Nm  "));

      // レイヤーを選択
      selectLayerByName(layerName);

      // レイヤーマスクの濃度を取得
      density = doc.activeLayer.layerMaskDensity;

      // レイヤーマスクの濃度が0より大きければレイヤーマスクがあると判定
      if(density > 0){
          if (i === 0) {
            // レイヤーの選択範囲を読み込む
            loadLayerMaskSelection();
          } else {
            // 2つ目以降のレイヤーに対しては追加選択範囲を読み込む
            addSelectionToMask(layerName);
          }
      }
    }
  } catch (e) {
    alert("エラーが発生しました:" + e);
  }
}

// 選択した複数のレイヤーのレイヤーマスクの選択範囲を読み込む
loadLayerMaskSelectionForMultipleLayers();

ScriptListenerで出力したアクションをChatGPTでスクリプト化して組み込んだりしながら作成しました。調べながら書いていくのは大変ですので、生成されたコードを見ながら分からない箇所をAIに聞く方が非プログラマーの自分には有用だと思いました。
では、また!

コメント

タイトルとURLをコピーしました