// 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 xbytor’s 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 subpathitem’s 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); } }