如何从 Photoshop 中的选区制作自定义图案?
How to make a custom pattern from selection in Photoshop?
TL;DR - 我想使用代码通过脚本 (Extendscript) 在 Photoshop 中的选择中定义自定义图案。
这是我目前的代码:
(function () {
var doc = app.activeDocument;
// I put 2 guides in the doc to easily get coords for this test
var guides = doc.guides;
var hGuide = guides[0].coordinate.value;
var vGuide = guides[1].coordinate.value;
// Select whole doc
doc.selection.selectAll();
var sel = doc.selection.bounds;
// Get percentages so we can resize the selection
var xVal = (hGuide / sel[2].value) * 100;
var yVal = (vGuide / sel[3].value) * 100;
doc.selection.resizeBoundary(xVal, yVal, AnchorPosition.TOPLEFT);
cTID = function (s) { return app.charIDToTypeID(s); };
sTID = function (s) { return app.stringIDToTypeID(s); };
// This part is recorded from an ActionListener
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putClass(cTID('Ptrn'));
desc1.putReference(cTID('null'), ref1);
var ref2 = new ActionReference();
ref2.putProperty(cTID('Prpr'), sTID("selection"));
ref2.putEnumerated(cTID('Dcmn'), cTID('Ordn'), cTID('Trgt'));
desc1.putReference(cTID('Usng'), ref2);
desc1.putString(cTID('Nm '), "Leaves");
app.executeAction(cTID('Mk '), desc1, DialogModes.NO);
})();
这是手动完成的,在 UI 中,使用选取框工具进行选择,然后转到“编辑”>“定义图案...”,输入名称,然后单击“确定”。
我已经记录了自己这样做的过程,并从中获得了 Javascript 中的动作脚本,但是当我 运行 它时,Extendscript 告诉我:“发生了一般的 Photoshop 错误。此功能可能在此版本的 Photoshop 中不可用。"
在使用 ActionDescriptors 和 ActionReferences 方面我不是很熟练,所以我希望得到一些帮助来定义自定义模式。
提前致谢!
**编辑:**当我手动进行选择时,ActionScript 代码有效,但是当我使用上面的代码进行选择时,它不起作用。我想知道为什么会有不同?
代码对我来说工作得很好。然而,像这样的事情往往会出现在新版本的 Photoshop 中。
这是一个远景,并不是真正的答案,但请尝试用以下代码替换您的 ScriptListener 代码:
// =======================================================
var idMk = charIDToTypeID( "Mk " );
var desc26 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref10 = new ActionReference();
var idPtrn = charIDToTypeID( "Ptrn" );
ref10.putClass( idPtrn );
desc26.putReference( idnull, ref10 );
var idUsng = charIDToTypeID( "Usng" );
var ref11 = new ActionReference();
var idPrpr = charIDToTypeID( "Prpr" );
var idfsel = charIDToTypeID( "fsel" );
ref11.putProperty( idPrpr, idfsel );
var idDcmn = charIDToTypeID( "Dcmn" );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
ref11.putEnumerated( idDcmn, idOrdn, idTrgt );
desc26.putReference( idUsng, ref11 );
var idNm = charIDToTypeID( "Nm " );
desc26.putString( idNm, "Leaves" );
executeAction( idMk, desc26, DialogModes.NO );
此外,您可能希望将一个字符串作为参数传递给您的函数,因为创建的所有模式都将被称为“leaves”
var myPatternName = "geometric pattern 4"
desc26.putString( idNm, myPatternName ); // was "Leaves"
我不确定我的设置发生了什么,但是当我使用 Ps Javascript API 制作 selection 时,代码出错了.但是当我使用 ActionScript 制作 selection 时,它起作用了。这是我对 select 所做的两个功能,然后从 selection 制作一个图案:
function setSelection(top, left, bottom, right) {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putProperty(app.charIDToTypeID('Chnl'), app.stringIDToTypeID("selection"));
desc1.putReference(app.charIDToTypeID('null'), ref1);
var desc2 = new ActionDescriptor();
desc2.putUnitDouble(app.charIDToTypeID('Top '), app.charIDToTypeID('#Pxl'), top);
desc2.putUnitDouble(app.charIDToTypeID('Left'), app.charIDToTypeID('#Pxl'), left);
desc2.putUnitDouble(app.charIDToTypeID('Btom'), app.charIDToTypeID('#Pxl'), bottom);
desc2.putUnitDouble(app.charIDToTypeID('Rght'), app.charIDToTypeID('#Pxl'), right);
desc1.putObject(app.charIDToTypeID('T '), app.charIDToTypeID('Rctn'), desc2);
executeAction(app.charIDToTypeID('setd'), desc1, DialogModes.NO);
}
function makePatternFromSelection(name) {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putClass(app.charIDToTypeID('Ptrn'));
desc1.putReference(app.charIDToTypeID('null'), ref1);
var ref2 = new ActionReference();
ref2.putProperty(app.charIDToTypeID('Prpr'), app.stringIDToTypeID("selection"));
ref2.putEnumerated(app.charIDToTypeID('Dcmn'), app.charIDToTypeID('Ordn'), app.charIDToTypeID('Trgt'));
desc1.putReference(app.charIDToTypeID('Usng'), ref2);
desc1.putString(app.charIDToTypeID('Nm '), name);
executeAction(app.charIDToTypeID('Mk '), desc1, DialogModes.NO);
}
TL;DR - 我想使用代码通过脚本 (Extendscript) 在 Photoshop 中的选择中定义自定义图案。
这是我目前的代码:
(function () {
var doc = app.activeDocument;
// I put 2 guides in the doc to easily get coords for this test
var guides = doc.guides;
var hGuide = guides[0].coordinate.value;
var vGuide = guides[1].coordinate.value;
// Select whole doc
doc.selection.selectAll();
var sel = doc.selection.bounds;
// Get percentages so we can resize the selection
var xVal = (hGuide / sel[2].value) * 100;
var yVal = (vGuide / sel[3].value) * 100;
doc.selection.resizeBoundary(xVal, yVal, AnchorPosition.TOPLEFT);
cTID = function (s) { return app.charIDToTypeID(s); };
sTID = function (s) { return app.stringIDToTypeID(s); };
// This part is recorded from an ActionListener
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putClass(cTID('Ptrn'));
desc1.putReference(cTID('null'), ref1);
var ref2 = new ActionReference();
ref2.putProperty(cTID('Prpr'), sTID("selection"));
ref2.putEnumerated(cTID('Dcmn'), cTID('Ordn'), cTID('Trgt'));
desc1.putReference(cTID('Usng'), ref2);
desc1.putString(cTID('Nm '), "Leaves");
app.executeAction(cTID('Mk '), desc1, DialogModes.NO);
})();
这是手动完成的,在 UI 中,使用选取框工具进行选择,然后转到“编辑”>“定义图案...”,输入名称,然后单击“确定”。
我已经记录了自己这样做的过程,并从中获得了 Javascript 中的动作脚本,但是当我 运行 它时,Extendscript 告诉我:“发生了一般的 Photoshop 错误。此功能可能在此版本的 Photoshop 中不可用。"
在使用 ActionDescriptors 和 ActionReferences 方面我不是很熟练,所以我希望得到一些帮助来定义自定义模式。
提前致谢!
**编辑:**当我手动进行选择时,ActionScript 代码有效,但是当我使用上面的代码进行选择时,它不起作用。我想知道为什么会有不同?
代码对我来说工作得很好。然而,像这样的事情往往会出现在新版本的 Photoshop 中。
这是一个远景,并不是真正的答案,但请尝试用以下代码替换您的 ScriptListener 代码:
// =======================================================
var idMk = charIDToTypeID( "Mk " );
var desc26 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref10 = new ActionReference();
var idPtrn = charIDToTypeID( "Ptrn" );
ref10.putClass( idPtrn );
desc26.putReference( idnull, ref10 );
var idUsng = charIDToTypeID( "Usng" );
var ref11 = new ActionReference();
var idPrpr = charIDToTypeID( "Prpr" );
var idfsel = charIDToTypeID( "fsel" );
ref11.putProperty( idPrpr, idfsel );
var idDcmn = charIDToTypeID( "Dcmn" );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
ref11.putEnumerated( idDcmn, idOrdn, idTrgt );
desc26.putReference( idUsng, ref11 );
var idNm = charIDToTypeID( "Nm " );
desc26.putString( idNm, "Leaves" );
executeAction( idMk, desc26, DialogModes.NO );
此外,您可能希望将一个字符串作为参数传递给您的函数,因为创建的所有模式都将被称为“leaves”
var myPatternName = "geometric pattern 4"
desc26.putString( idNm, myPatternName ); // was "Leaves"
我不确定我的设置发生了什么,但是当我使用 Ps Javascript API 制作 selection 时,代码出错了.但是当我使用 ActionScript 制作 selection 时,它起作用了。这是我对 select 所做的两个功能,然后从 selection 制作一个图案:
function setSelection(top, left, bottom, right) {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putProperty(app.charIDToTypeID('Chnl'), app.stringIDToTypeID("selection"));
desc1.putReference(app.charIDToTypeID('null'), ref1);
var desc2 = new ActionDescriptor();
desc2.putUnitDouble(app.charIDToTypeID('Top '), app.charIDToTypeID('#Pxl'), top);
desc2.putUnitDouble(app.charIDToTypeID('Left'), app.charIDToTypeID('#Pxl'), left);
desc2.putUnitDouble(app.charIDToTypeID('Btom'), app.charIDToTypeID('#Pxl'), bottom);
desc2.putUnitDouble(app.charIDToTypeID('Rght'), app.charIDToTypeID('#Pxl'), right);
desc1.putObject(app.charIDToTypeID('T '), app.charIDToTypeID('Rctn'), desc2);
executeAction(app.charIDToTypeID('setd'), desc1, DialogModes.NO);
}
function makePatternFromSelection(name) {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putClass(app.charIDToTypeID('Ptrn'));
desc1.putReference(app.charIDToTypeID('null'), ref1);
var ref2 = new ActionReference();
ref2.putProperty(app.charIDToTypeID('Prpr'), app.stringIDToTypeID("selection"));
ref2.putEnumerated(app.charIDToTypeID('Dcmn'), app.charIDToTypeID('Ordn'), app.charIDToTypeID('Trgt'));
desc1.putReference(app.charIDToTypeID('Usng'), ref2);
desc1.putString(app.charIDToTypeID('Nm '), name);
executeAction(app.charIDToTypeID('Mk '), desc1, DialogModes.NO);
}