feat: AI套图分层方案 + Gemini集成 - 4种图案类型处理 + 正片叠底 + 宽高比 + 模型选择

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-07 16:59:56 +08:00
parent 12395d8eca
commit dae906aba7
277 changed files with 15009 additions and 19922 deletions

View File

@@ -0,0 +1,627 @@
// photoshopscripts.wordpress.com
////////////////////////////////////
// Split to Layers 1.0 //
// 2012, David Jensen //
// //
// With help from //
// pfaffenbichler and xbytor //
// at ps-scripts.com //
////////////////////////////////////
#target photoshop
//更改以下 5 个值中的任何一个以自定义脚本的默认选项:
var showOptionsDialog = true; //设置为 false 以禁用对用户的提示.
var tolerance = 2; // 将被忽略的透明像素的最大间隙,设置默认值.
var confirmThreshold = 20; // 如果脚本要制作大量图层,提示用户确认这是可以的.
var suffix = "-"; // 将此添加到新图层的图层名称中. 设置为空不添加.
var addCount = true; // 在每个新层的末尾添加一个增量数字.
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
function 裁片分解()
{
var layerNamePreview=activeDocument.activeLayer.name + suffix;
if (addCount === true){
layerNamePreview += "1";
}
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.POINTS;
bounds = activeDocument.activeLayer.bounds
var emptyLayer=false;
if (Number(bounds[0]) == 0 && Number(bounds[1]) == 0 && Number(bounds[2]) == 0 && Number(bounds[3]) == 0) {emptyLayer = true};
try{
if (activeDocument.activeLayer.kind != undefined && activeDocument.activeLayer.isBackgroundLayer == false && emptyLayer == false){
activeDocument.suspendHistory("Separate", "main()");
//~ app.doForcedProgress("PSMark-裁片分解","PSMark_main()");
//~ app.doProgress("PSMark-裁片分解","PSMark_main()");
//~ app.doForcedProgress("PSMark-裁片分解","main()");
}else{
alert( "未选择支持的图层类型.");
}
}catch(err){
alert(err)
}
app.preferences.rulerUnits = originalRulerUnits;
}
function PSMark_main()
{
app.activeDocument.suspendHistory("Separate", "main()");
}
function main() {
baseLayer=activeDocument.activeLayer;
activeDocument.quickMaskMode = false;
activeDocument.selection.deselect()
var layerName = activeDocument.activeLayer.name
//if a selection can't be made, stop running the script
var idCpTL = charIDToTypeID("CpTL");
executeAction(idCpTL, undefined, DialogModes.NO);
activeDocument.activeLayer.rasterize(RasterizeType.ENTIRELAYER)
try{
var idDlt = charIDToTypeID( "Dlt " );
var desc120 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref112 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref112.putEnumerated( idChnl, idChnl, idMsk );
desc120.putReference( idnull, ref112 );
var idAply = charIDToTypeID( "Aply" );
desc120.putBoolean( idAply, true );
executeAction( idDlt, desc120, DialogModes.NO );
}catch(e){}
activeDocument.activeLayer.name = layerName;
baseLayer=activeDocument.activeLayer;
makeSelection();
var idMk = charIDToTypeID("Mk ");
var desc642 = new ActionDescriptor();
var idNw = charIDToTypeID("Nw ");
var idDcmn = charIDToTypeID("Dcmn");
desc642.putClass(idNw, idDcmn);
var idUsng = charIDToTypeID("Usng");
var ref535 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref535.putEnumerated(idChnl, idOrdn, idTrgt);
desc642.putReference(idUsng, ref535);
executeAction(idMk, desc642, DialogModes.NO);
newDoc = activeDocument;
// =======================================================
activeDocument.resizeImage("200%", "200%", undefined, ResampleMethod.NEARESTNEIGHBOR);
// =======================================================
var idsetd = charIDToTypeID("setd");
var desc934 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref535 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref535.putProperty(idChnl, idfsel);
desc934.putReference(idnull, ref535);
var idT = charIDToTypeID("T ");
var ref536 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref536.putEnumerated(idChnl, idOrdn, idTrgt);
desc934.putReference(idT, ref536);
executeAction(idsetd, desc934, DialogModes.NO);
var idMk = charIDToTypeID("Mk ");
var desc403 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref288 = new ActionReference();
var idPath = charIDToTypeID("Path");
ref288.putClass(idPath);
desc403.putReference(idnull, ref288);
var idFrom = charIDToTypeID("From");
var ref289 = new ActionReference();
var idcsel = charIDToTypeID("csel");
var idfsel = charIDToTypeID("fsel");
var idfsel = charIDToTypeID("fsel");
ref289.putProperty(idcsel, idfsel);
desc403.putReference(idFrom, ref289);
var idTlrn = charIDToTypeID("Tlrn");
var idPxl = charIDToTypeID("#Pxl");
desc403.putUnitDouble(idTlrn, idPxl, 0.500000);
executeAction(idMk, desc403, DialogModes.NO);
var subPathsLength = activeDocument.pathItems[0].subPathItems.length
if (subPathsLength>confirmThreshold){
var answer = confirm("基于"+subPathsLength+ "个拆分对象将创建图层. 你想继续吗?",true)
if (answer === false){
newDoc.close(SaveOptions.DONOTSAVECHANGES);
activeDocument.quickMaskMode = false;
activeDocument.selection.deselect();
return 0;
}
}
// =======================================================
activeDocument.resizeImage("50%", "50%", undefined, ResampleMethod.NEARESTNEIGHBOR)
var pathInfo = collectPathInfoFromDesc(activeDocument, activeDocument.pathItems[activeDocument.pathItems.length - 1])
// =======================================================
newDoc.close(SaveOptions.DONOTSAVECHANGES)
// =======================================================
activeDocument.quickMaskMode = false
// =======================================================
//make channel
// =======================================================
var idMk = charIDToTypeID("Mk ");
var desc6 = new ActionDescriptor();
var idNw = charIDToTypeID("Nw ");
var desc7 = new ActionDescriptor();
var idNm = charIDToTypeID("Nm ");
desc7.putString(idNm, "ContiguityMask");
var idClrI = charIDToTypeID("ClrI");
var idMskI = charIDToTypeID("MskI");
var idMskA = charIDToTypeID("MskA");
desc7.putEnumerated(idClrI, idMskI, idMskA);
var idClr = charIDToTypeID("Clr ");
var desc8 = new ActionDescriptor();
var idRd = charIDToTypeID("Rd ");
desc8.putDouble(idRd, 255.000000);
var idGrn = charIDToTypeID("Grn ");
desc8.putDouble(idGrn, 0.000000);
var idBl = charIDToTypeID("Bl ");
desc8.putDouble(idBl, 0.000000);
var idRGBC = charIDToTypeID("RGBC");
desc7.putObject(idClr, idRGBC, desc8);
var idOpct = charIDToTypeID("Opct");
desc7.putInteger(idOpct, 50);
var idChnl = charIDToTypeID("Chnl");
desc6.putObject(idNw, idChnl, desc7);
var idUsng = charIDToTypeID("Usng");
var ref5 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref5.putProperty(idChnl, idfsel);
desc6.putReference(idUsng, ref5);
executeAction(idMk, desc6, DialogModes.NO);
doc_name = app.activeDocument.name.replace(/(?:\.[^.]*$|$)/, '');
var layerCount = 1
for (i = 0; i < subPathsLength; i++) {
//deselect
var idsetd = charIDToTypeID("setd");
var desc279 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref137 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref137.putProperty(idChnl, idfsel);
desc279.putReference(idnull, ref137);
var idT = charIDToTypeID("T ");
var idOrdn = charIDToTypeID("Ordn");
var idNone = charIDToTypeID("None");
desc279.putEnumerated(idT, idOrdn, idNone);
executeAction(idsetd, desc279, DialogModes.NO);
///select alpha channel
var idslct = charIDToTypeID("slct");
var desc315 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref175 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
ref175.putName(idChnl, "ContiguityMask");
desc315.putReference(idnull, ref175);
executeAction(idslct, desc315, DialogModes.NO);
//use magic wand
var idsetd = charIDToTypeID("setd");
var desc263 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref123 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref123.putProperty(idChnl, idfsel);
desc263.putReference(idnull, ref123);
var idT = charIDToTypeID("T ");
var desc264 = new ActionDescriptor();
var idHrzn = charIDToTypeID("Hrzn");
var idRlt = charIDToTypeID("#Rlt");
desc264.putUnitDouble(idHrzn, idRlt, pathInfo[i][0][0]);
var idVrtc = charIDToTypeID("Vrtc");
var idRlt = charIDToTypeID("#Rlt");
desc264.putUnitDouble(idVrtc, idRlt, pathInfo[i][0][1]);
var idPnt = charIDToTypeID("Pnt ");
desc263.putObject(idT, idPnt, desc264);
var idTlrn = charIDToTypeID("Tlrn");
desc263.putInteger(idTlrn, 1);
executeAction(idsetd, desc263, DialogModes.NO);
var idslct = charIDToTypeID("slct");
var desc346 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref205 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idChnl = charIDToTypeID("Chnl");
var idRGB = charIDToTypeID("RGB ");
ref205.putEnumerated(idChnl, idChnl, idRGB);
desc346.putReference(idnull, ref205);
var idMkVs = charIDToTypeID("MkVs");
desc346.putBoolean(idMkVs, false);
executeAction(idslct, desc346, DialogModes.NO);
try {
// =======================================================
var idCpTL = charIDToTypeID("CpTL");
executeAction(idCpTL, undefined, DialogModes.NO);
try {
var idrasterizeLayer = stringIDToTypeID("rasterizeLayer");
var desc924 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref721 = new ActionReference();
var idLyr = charIDToTypeID("Lyr ");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref721.putEnumerated(idLyr, idOrdn, idTrgt);
desc924.putReference(idnull, ref721);
var idWhat = charIDToTypeID("What");
var idrasterizeItem = stringIDToTypeID("rasterizeItem");
var idvectorMask = stringIDToTypeID("vectorMask");
desc924.putEnumerated(idWhat, idrasterizeItem, idvectorMask);
executeAction(idrasterizeLayer, desc924, DialogModes.NO);
} catch (err) {}
try {
var idIntr = charIDToTypeID("Intr");
var desc864 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref658 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref658.putEnumerated(idChnl, idOrdn, idTrgt);
desc864.putReference(idnull, ref658);
var idWith = charIDToTypeID("With");
var ref659 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref659.putProperty(idChnl, idfsel);
desc864.putReference(idWith, ref659);
executeAction(idIntr, desc864, DialogModes.NO);
// =======================================================
var idDlt = charIDToTypeID("Dlt ");
var desc865 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref660 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref660.putEnumerated(idChnl, idOrdn, idTrgt);
desc865.putReference(idnull, ref660);
executeAction(idDlt, desc865, DialogModes.NO);
// =======================================================
var idMk = charIDToTypeID("Mk ");
var desc866 = new ActionDescriptor();
var idNw = charIDToTypeID("Nw ");
var idChnl = charIDToTypeID("Chnl");
desc866.putClass(idNw, idChnl);
var idAt = charIDToTypeID("At ");
var ref661 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idChnl = charIDToTypeID("Chnl");
var idMsk = charIDToTypeID("Msk ");
ref661.putEnumerated(idChnl, idChnl, idMsk);
desc866.putReference(idAt, ref661);
var idUsng = charIDToTypeID("Usng");
var idUsrM = charIDToTypeID("UsrM");
var idRvlS = charIDToTypeID("RvlS");
desc866.putEnumerated(idUsng, idUsrM, idRvlS);
executeAction(idMk, desc866, DialogModes.NO);
} catch (err) {}
var finalSuffix = suffix;
if (addCount===true)
{
finalSuffix += layerCount;
}
//~ activeDocument.activeLayer.name = layerName + finalSuffix;
//分解的图层命名
activeDocument.activeLayer.name = "Mark" +"-" + doc_name + finalSuffix;
layerCount++;
//~ $.writeln(100*(layerCount-1)/subPathsLength);
//~ $.writeln("subPathsLength:"+subPathsLength);
//~ app.updateProgress(100*(layerCount-1)/subPathsLength,100);
activeDocument.activeLayer=baseLayer;
}
catch (e) {}
}
var idsetd = charIDToTypeID("setd");
var desc1045 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref578 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref578.putProperty(idChnl, idfsel);
desc1045.putReference(idnull, ref578);
var idT = charIDToTypeID("T ");
var idOrdn = charIDToTypeID("Ordn");
var idNone = charIDToTypeID("None");
desc1045.putEnumerated(idT, idOrdn, idNone);
executeAction(idsetd, desc1045, DialogModes.NO);
// =======================================================
var idDlt = charIDToTypeID("Dlt ");
var desc694 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref323 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
ref323.putName(idChnl, "ContiguityMask");
desc694.putReference(idnull, ref323);
executeAction(idDlt, desc694, DialogModes.NO);
activeDocument.activeLayer.remove();
var idHd = charIDToTypeID("Hd ");
var desc736 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var list22 = new ActionList();
var ref541 = new ActionReference();
var idLyr = charIDToTypeID("Lyr ");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref541.putEnumerated(idLyr, idOrdn, idTrgt);
list22.putReference(ref541);
desc736.putList(idnull, list22);
executeAction(idHd, desc736, DialogModes.NO);
}
// pfaffenbichler and xbytor //
// at ps-scripts.com //
// created this function //
function collectPathInfoFromDesc(myDocument, thePath) {
var myDocument = app.activeDocument;
// based of functions from xbytors stdlib;
var ref = new ActionReference();
for (var l = 0; l < myDocument.pathItems.length; l++) {
var thisPath = myDocument.pathItems[l];
if (thisPath == thePath && thisPath.name == "Work Path") {
ref.putProperty(cTID("Path"), cTID("WrPt"));
};
if (thisPath == thePath && thisPath.name != "Work Path" && thisPath.kind != PathKind.VECTORMASK) {
ref.putIndex(cTID("Path"), l + 1);
};
if (thisPath == thePath && thisPath.kind == PathKind.VECTORMASK) {
var idPath = charIDToTypeID("Path");
var idPath = charIDToTypeID("Path");
var idvectorMask = stringIDToTypeID("vectorMask");
ref.putEnumerated(idPath, idPath, idvectorMask);
};
};
var desc = app.executeActionGet(ref);
var pname = desc.getString(cTID('PthN'));
// create new array;
var theArray = new Array;
var pathComponents = desc.getObjectValue(cTID("PthC")).getList(sTID('pathComponents'));
// for subpathitems;
for (var m = 0; m < pathComponents.count; m++) {
var listKey = pathComponents.getObjectValue(m).getList(sTID("subpathListKey"));
// for subpathitems count;
for (var n = 0; n < listKey.count; n++) {
var points = listKey.getObjectValue(n).getList(sTID('points'));
// get first point;
var anchorObj = points.getObjectValue(0).getObjectValue(sTID("anchor"));
var anchor = [anchorObj.getUnitDoubleValue(sTID('horizontal')), anchorObj.getUnitDoubleValue(sTID('vertical'))];
var thisPoint = [anchor];
theArray.push(thisPoint);
};
};
// by xbytor, thanks to him;
function cTID(s) {
return cTID[s] || cTID[s] = app.charIDToTypeID(s);
};
function sTID(s) {
return sTID[s] || sTID[s] = app.stringIDToTypeID(s);
};
// reset;
return theArray;
};
function makePreviewSelection(){
makeSelection()
app.refresh()
activeDocument.quickMaskMode = false;
}
function makeSelection(){
try{
var idsetd = charIDToTypeID("setd");
var desc922 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref529 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref529.putProperty(idChnl, idfsel);
desc922.putReference(idnull, ref529);
var idT = charIDToTypeID("T ");
var ref530 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idChnl = charIDToTypeID("Chnl");
var idTrsp = charIDToTypeID("Trsp");
ref530.putEnumerated(idChnl, idChnl, idTrsp);
desc922.putReference(idT, ref530);
executeAction(idsetd, desc922, DialogModes.NO);
} catch (err) {
return false;
}
try {
var idIntr = charIDToTypeID("Intr");
var desc846 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref639 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idChnl = charIDToTypeID("Chnl");
var idMsk = charIDToTypeID("Msk ");
ref639.putEnumerated(idChnl, idChnl, idMsk);
desc846.putReference(idnull, ref639);
var idWith = charIDToTypeID("With");
var ref640 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref640.putProperty(idChnl, idfsel);
desc846.putReference(idWith, ref640);
executeAction(idIntr, desc846, DialogModes.NO);
} catch (err) {}
try {
// =======================================================
var idIntW = charIDToTypeID("IntW");
var desc787 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref572 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idfsel = charIDToTypeID("fsel");
ref572.putProperty(idChnl, idfsel);
desc787.putReference(idnull, ref572);
var idT = charIDToTypeID("T ");
var ref573 = new ActionReference();
var idPath = charIDToTypeID("Path");
var idPath = charIDToTypeID("Path");
var idvectorMask = stringIDToTypeID("vectorMask");
ref573.putEnumerated(idPath, idPath, idvectorMask);
var idLyr = charIDToTypeID("Lyr ");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref573.putEnumerated(idLyr, idOrdn, idTrgt);
desc787.putReference(idT, ref573);
var idVrsn = charIDToTypeID("Vrsn");
desc787.putInteger(idVrsn, 1);
var idvectorMaskParams = stringIDToTypeID("vectorMaskParams");
desc787.putBoolean(idvectorMaskParams, true);
executeAction(idIntW, desc787, DialogModes.NO);
} catch (err) {}
if (tolerance >= 2) {
activeDocument.selection.expand(Math.floor(tolerance / 2))
}
activeDocument.quickMaskMode = true;
var idThrs = charIDToTypeID("Thrs");
var desc479 = new ActionDescriptor();
var idLvl = charIDToTypeID("Lvl ");
desc479.putInteger(idLvl, 1);
executeAction(idThrs, desc479, DialogModes.NO);
if (tolerance % 2 == 1) {
var idMtnB = charIDToTypeID("MtnB");
var desc213 = new ActionDescriptor();
var idAngl = charIDToTypeID("Angl");
desc213.putInteger(idAngl, 0);
var idDstn = charIDToTypeID("Dstn");
var idPxl = charIDToTypeID("#Pxl");
desc213.putUnitDouble(idDstn, idPxl, 1.000000);
executeAction(idMtnB, desc213, DialogModes.NO);
// =======================================================
var idMtnB = charIDToTypeID("MtnB");
var desc214 = new ActionDescriptor();
var idAngl = charIDToTypeID("Angl");
desc214.putInteger(idAngl, 90);
var idDstn = charIDToTypeID("Dstn");
var idPxl = charIDToTypeID("#Pxl");
desc214.putUnitDouble(idDstn, idPxl, 1.000000);
executeAction(idMtnB, desc214, DialogModes.NO);
// =======================================================
var idThrs = charIDToTypeID("Thrs");
var desc215 = new ActionDescriptor();
var idLvl = charIDToTypeID("Lvl ");
desc215.putInteger(idLvl, 1);
executeAction(idThrs, desc215, DialogModes.NO);
}
}