こんにちは!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に聞く方が非プログラマーの自分には有用だと思いました。
では、また!
コメント