Photoshopで選択した複数レイヤーの不透明度をランダムに変更

こんにちは!Rhinoです。
3DCGの制作現場でも相変わらず大活躍のPhotoshopですが、テクスチャを描いている時に、レイヤーの不透明度をランダムで変更できたら面白いのではないかと思いまして、前回のChatGPTを使ってPhotoshopのスクリプトを書いてみましたで紹介させていただきましたスクリプトの内容を一部変更して作成してみました。
選択したレイヤーを特定するために、レイヤー名を使用している都合上、同じレイヤー名のレイヤーがあると不都合が生じてしまいますね。
この部分は考え中です。正直にレイヤーIDで選択したほうが良いのかもしれませんね。
いずれにせよ、ChatGPTのおかげで今まで思いつかなかったような方法を試すことができて嬉しく思っています。

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

/**
 * レイヤーの不透明度を5%刻みでランダムな値に変更します。
 * @param {ArtLayer} layer - 不透明度を変更するレイヤーオブジェクト
 * @param {number} minOpacity - 不透明度の最小値
 * @param {number} maxOpacity - 不透明度の最大値
 */
function changeOpacityWithStep(layer, minOpacity, maxOpacity) {
  try {
    // ランダムな不透明度を生成
    var randomOpacity = Math.round((Math.random() * (maxOpacity - minOpacity) + minOpacity) * 2 / 10) * 10 / 2;
	// レイヤーの不透明度を設定
    layer.opacity = randomOpacity;
  } catch (e) {
    alert("エラーが発生しました:" + e);
  }
}

/**
 * 指定したレイヤー名でレイヤーを選択します。
 * @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 changeOpacityMultipleLayers() {
	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);
		var selectedLayer = doc.activeLayer;
		
		// メインの処理
		try {
			// ランダムな不透明度の範囲を指定(0~100の間)
			var minOpacity = 0;
			var maxOpacity = 75;
			
			// 不透明度を変更
			changeOpacityWithStep(selectedLayer,minOpacity,maxOpacity);
		} catch (e) {
		alert("エラーが発生しました:" + e);
		}
	}
}

changeOpacityMultipleLayers();

このスクリプトでは5%刻みでレイヤーの不透明度を変更したかったので、一旦10倍して丸めた後に2で割ってみました。こちらももっとスマートな方法があるのかも…
勉強は続きますね。
では、また!

コメント

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