Skip to content

Instantly share code, notes, and snippets.

@Yamonov
Created October 11, 2025 14:35
Show Gist options
  • Select an option

  • Save Yamonov/2d45eb130df8c1d606190771fbae03a2 to your computer and use it in GitHub Desktop.

Select an option

Save Yamonov/2d45eb130df8c1d606190771fbae03a2 to your computer and use it in GitHub Desktop.
Photoshopマスク回りスクリプト
/*
<javascriptresource>
<name>マスクカラー変更</name>
<category>YPresets</category>
</javascriptresource>
*/
// クイックマスク、レイヤーマスクがオーバーレイ表示されているとき、実行する度に色相環を60度ずつ変更
var regKey = "myMaskColor"; // 実行内容を記録するキー
// カラー設定
var defaultSaturation = 80; // 彩度(0〜100)
var defaultBrightness = 80; // 輝度(0〜100)
var defaultOpacity = 90; // 不透明度(0〜100)
var hueStep = 60; // 前回から加算するH(例: 120=RGB, 60=CMY)
// 前回記録の取得 or 初回記録
var currentHue;
try {
var desc = app.getCustomOptions(regKey);
currentHue = parseInt(desc.getString(1001), 10);
} catch (e) {
currentHue = saveHue(0); // 初回は0で記録
}
// 新しい色相の計算と保存
currentHue += hueStep;
if (currentHue >= 360) currentHue = 0;
saveHue(currentHue);
// 実行
try {
applyMaskColor(currentHue);
} catch (e) {}
// 関数:H値を保存
function saveHue(hue) {
var desc = new ActionDescriptor();
desc.putString(1001, String(hue));
app.putCustomOptions(regKey, desc, true);
return hue;
}
// 関数:マスクカラーを変更
function applyMaskColor(hue) {
var idSet = charIDToTypeID("setd");
var descSet = new ActionDescriptor();
var idNull = charIDToTypeID("null");
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID("Chnl"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
descSet.putReference(idNull, ref);
var idTo = charIDToTypeID("T ");
var descChannel = new ActionDescriptor();
var idColor = charIDToTypeID("Clr ");
var descHSB = new ActionDescriptor();
descHSB.putUnitDouble(charIDToTypeID("H "), charIDToTypeID("#Ang"), hue);
descHSB.putDouble(charIDToTypeID("Strt"), defaultSaturation);
descHSB.putDouble(charIDToTypeID("Brgh"), defaultBrightness);
descChannel.putObject(idColor, charIDToTypeID("HSBC"), descHSB);
// 不透明度を設定(不要ならこのブロック削除)
descChannel.putUnitDouble(
charIDToTypeID("Opct"),
charIDToTypeID("#Prc"),
defaultOpacity
);
descSet.putObject(idTo, charIDToTypeID("Chnl"), descChannel);
executeAction(idSet, descSet, DialogModes.NO);
}
/*
レイヤーマスク・クイックマスクのマスクのみ表示とオーバーレイ表示を
実行するたびにトグルするスクリプト Ver.3(Yoshiteru Murakami)
<javascriptresource>
<name>マスクトグル表示v3</name>
<category>YPresets</category>
</javascriptresource>
*/
if (app.documents.length) {
main();
}
//実行部分
function main() {
var myDoc = app.activeDocument;
var myCh = myDoc.channels;
var myVisibleCh = getChannel();
var myChID = [];
//モード判別
try {
switch (myDoc.mode) {
case DocumentMode.LAB:
var myMode = 3;
myChID = ['Lght', 'A ', 'B '];
break;
case DocumentMode.GRAYSCALE:
var myMode = 1;
myChID = ['Blck'];
break;
case DocumentMode.RGB:
var myMode = 3;
myChID = ['Rd ', 'Grn ', 'Bl '];
break;
case DocumentMode.CMYK:
var myMode = 4;
myChID = ['Cyn ', 'Mgnt', 'Yllw', 'Blck'];
break;
case DocumentMode.INDEXCOLOR:
var myMode = 1;
myChID = ['RGB '];
break;
case DocumentMode.MULTICHANNEL:
case DocumentMode.BITMAP:
alert('このモードは未対応です');
return;
break;
}
} catch (e) {
return
};
//var myChVis=getVisible ();
//クイックマスクモード
if (myDoc.quickMaskMode) {
if (getVisible()) {
SwHdComponents(myChID, 'Hd ');
} else {
SwHdComponents(myChID, 'Shw ');
};
return;
};
//レイヤーマスクの有無
if (!hasLayerMask()) {
return;
};
//レイヤーマスク表示・非表示
if (myVisibleCh > myMode) {
ShowMask();
return;
};
if (myVisibleCh == myMode && myMode != 1) {
ShowwithMask();
return;
};
if (myMode == 1) {
if (myVisibleCh == 1 && getVisible() == 1) {
ShowwithMask();
} else {
HideMask();
};
} else {
HideMask()
};
} //mainここまで
//コンポーネントチャンネルが表示されているか Buliarca Cristian http://buliarcatools.blog.fc2.com/blog-entry-5.html
function getVisible() {
var map = {}
map[DocumentMode.GRAYSCALE] = charIDToTypeID('Blck');
map[DocumentMode.RGB] = charIDToTypeID('RGB ');
map[DocumentMode.CMYK] = charIDToTypeID('CMYK');
map[DocumentMode.LAB] = charIDToTypeID('Lab ');
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID('Chnl'), charIDToTypeID('Chnl'), map[app.activeDocument.mode]);
var vis = executeActionGet(ref).getInteger(stringIDToTypeID('visible'));
return vis;
}
//コンポーネントチャンネルを表示・非表示
function SwHdComponents(myQMID, mySH) {
var myQMIDLength = myQMID.length;
var myADSwHd = charIDToTypeID(mySH);
var myADDesc = new ActionDescriptor();
var idnull = charIDToTypeID('null');
var myADList = new ActionList();
for (i = 0; i < myQMIDLength; i++) {
var myADRef = new ActionReference();
var idChnl = charIDToTypeID('Chnl');
var idRd = charIDToTypeID(myQMID[i]);
myADRef.putEnumerated(idChnl, idChnl, idRd);
myADList.putReference(myADRef);
}
myADDesc.putList(idnull, myADList);
executeAction(myADSwHd, myADDesc, DialogModes.NO);
}
//マスク非表示
function HideMask() {
var idSlct = charIDToTypeID('slct');
var idNull = charIDToTypeID('null');
var idChnl = charIDToTypeID('Chnl');
var idMsk = charIDToTypeID('Msk ');
var idMkVs = charIDToTypeID('MkVs');
var switchToMaskDescriptor = new ActionDescriptor();
var actionRef = new ActionReference();
actionRef.putEnumerated(idChnl, idChnl, idMsk);
switchToMaskDescriptor.putReference(idNull, actionRef);
switchToMaskDescriptor.putBoolean(idMkVs, false);
executeAction(idSlct, switchToMaskDescriptor, DialogModes.NO);
}
//マスクのみ表示
function ShowMask() {
var idSlct = charIDToTypeID('slct');
var idNull = charIDToTypeID('null');
var idChnl = charIDToTypeID('Chnl');
var idMsk = charIDToTypeID('Msk ');
var idMkVs = charIDToTypeID('MkVs');
var switchToMaskDescriptor = new ActionDescriptor();
var actionRef = new ActionReference();
actionRef.putEnumerated(idChnl, idChnl, idMsk);
switchToMaskDescriptor.putReference(idNull, actionRef);
switchToMaskDescriptor.putBoolean(idMkVs, true);
executeAction(idSlct, switchToMaskDescriptor, DialogModes.NO);
}
//マスクオーバーレイ
function ShowwithMask() {
var idShw = charIDToTypeID('Shw ');
var desc = new ActionDescriptor();
var idnull = charIDToTypeID('null');
var list = new ActionList();
var ref = new ActionReference();
var idChnl = charIDToTypeID('Chnl');
var idMsk = charIDToTypeID('Msk ');
ref.putEnumerated(idChnl, idChnl, idMsk);
list.putReference(ref);
desc.putList(idnull, list);
executeAction(idShw, desc, DialogModes.NO);
}
//レイヤーマスクの有無判定 Paul Riggott https://forums.adobe.com/thread/909630
function hasLayerMask() {
var hasLayerMask = false;
try {
var ref = new ActionReference();
var keyUserMaskEnabled = app.charIDToTypeID('UsrM');
ref.putProperty(app.charIDToTypeID('Prpr'), keyUserMaskEnabled);
ref.putEnumerated(app.charIDToTypeID('Lyr '), app.charIDToTypeID('Ordn'), app.charIDToTypeID('Trgt'));
var desc = executeActionGet(ref);
if (desc.hasKey(keyUserMaskEnabled)) {
hasLayerMask = true;
}
} catch (e) {
hasLayerMask = false;
}
return hasLayerMask;
}
//表示されているチャンネル数取得 Buliarca Cristian http://buliarcatools.blog.fc2.com/blog-entry-5.html
function getChannel() {
var ref = new ActionReference();
var keyVisChannels = app.stringIDToTypeID('visibleChannels');
ref.putEnumerated(app.charIDToTypeID('Lyr '), app.charIDToTypeID('Ordn'), app.charIDToTypeID('Trgt'));
var desc = executeActionGet(ref);
return desc.getList(keyVisChannels).count;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment