// ************************************************** // This file created by Brett Bibby (c) 2010-2013 // You may freely use and modify this file as you see fit // You may not sell it //************************************************** // hidden object game exporter //$.writeln("=== Starting Debugging Session ==="); // enable double clicking from the Macintosh Finder or the Windows Explorer #target photoshop // debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning) // $.level = 0; // debugger; // launch debugger on next line var sceneData; var sourcePsd; var duppedPsd; var destinationFolder; var uuid; var sourcePsdName; var slicePaddingArr = new Array(0,0,0,0) var sliceOriArr = new Array(0,0,0,0) main(); function main(){ // got a valid document? if (app.documents.length <= 0) { if (app.playbackDisplayDialogs != DialogModes.NO) { alert("You must have a document open to export!"); } // quit, returning 'cancel' makes the actions palette not record our script return 'cancel'; } // ask for where the exported files should go destinationFolder = Folder.selectDialog("Choose the destination for export."); if (!destinationFolder) { return; } // cache useful variables uuid = 1; sourcePsdName = app.activeDocument.name; var layerCount = app.documents[sourcePsdName].layers.length; var layerSetsCount = app.documents[sourcePsdName].layerSets.length; if ((layerCount <= 1) && (layerSetsCount <= 0)) { if (app.playbackDisplayDialogs != DialogModes.NO) { alert("You need a document with multiple layers to export!"); // quit, returning 'cancel' makes the actions palette not record our script return 'cancel'; } } // setup the units in case it isn't pixels var savedRulerUnits = app.preferences.rulerUnits; var savedTypeUnits = app.preferences.typeUnits; app.preferences.rulerUnits = Units.PIXELS; app.preferences.typeUnits = TypeUnits.PIXELS; // duplicate document so we can extract everythng we need duppedPsd = app.activeDocument.duplicate(); duppedPsd.activeLayer = duppedPsd.layers[duppedPsd.layers.length - 1]; hideAllLayers(duppedPsd); // export layers sceneData = ""; sceneData += ""; sceneData += "\n"; sceneData += "" + duppedPsd.width.value + ""; sceneData += "" + duppedPsd.height.value+ ""; sceneData += ""; sceneData += "\n"; exportAllLayers(duppedPsd); sceneData += ""; sceneData += "\n"; $.writeln(sceneData); duppedPsd.close(SaveOptions.DONOTSAVECHANGES); // create export var sceneFile = new File(destinationFolder + "/" + destinationFolder.name + ".xml"); sceneFile.encoding = "utf-8"; //写文件时指定编码,不然中文会出现乱码 sceneFile.open('w'); sceneFile.writeln(sceneData); sceneFile.close(); app.preferences.rulerUnits = savedRulerUnits; app.preferences.typeUnits = savedTypeUnits; } function exportAllLayers(obj) { if (typeof(obj) == "undefined"){ return; } if (typeof(obj.layers) != "undefined" && obj.layers.length>0) { for (var i = obj.layers.length - 1; 0 <= i; i--) { exportLayer(obj.layers[i]) } } else{ exportLayer(obj) }; } function exportLayer(obj) { if (typeof(obj) == "undefined"){ return; } if (obj.typename == "LayerSet") { exportLayerSet(obj); } else if (obj.typename = "ArtLayer"){ exportArtLayer(obj); } } function exportLayerSet(_layer) { if (typeof(_layer.layers) == "undefined" || _layer.layers.length<=0 ){ return } if (_layer.name.search("@ScrollView") >= 0) { exportScrollView(_layer); } else if (_layer.name.search("@Grid") >= 0) { exportGrid(_layer); } else if (_layer.name.search("@Button") >= 0) { exportButton(_layer); } else if (_layer.name.search("@Toggle") >= 0) { exportToggle(_layer); } else if (_layer.name.search("@Panel") >= 0) { exportPanel(_layer); } else if (_layer.name.search("@Slider")>=0) { exportSlider(_layer); } else if (_layer.name.search("@Group")>=0) { exportGroup(_layer); } else if (_layer.name.search("@InputField") >=0) { exportInputField(_layer); } else if (_layer.name.search("@Scrollbar") >=0) { exportScrollBar(_layer); }else if (_layer.name.search("@LE") >=0) {//增加布局元素导出 exportLayoutElement(_layer); } else { sceneData += ""; sceneData += "Normal"; sceneData += "" + _layer.name + ""; sceneData += ""; exportAllLayers(_layer) sceneData += ""; sceneData += ""; } } function exportLayoutElement(obj) { sceneData += ""; sceneData += "LayoutElement"; var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += "" + itemName + ""; sceneData += ""; exportAllLayers(obj); // sceneData += ""; // for (var j = obj.artLayers.length - 1; 0 <= j; j--) // { // exportArtLayer(obj.artLayers[j]); // } // sceneData += ""; sceneData += ""; obj.visible = true; showAllLayers(obj); var recSize = getLayerRec(duppedPsd.duplicate()); sceneData += ""; sceneData += "" + recSize.x + ""; sceneData += "" + recSize.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + recSize.width + ""; sceneData += "" + recSize.height + ""; sceneData += ""; hideAllLayers(obj); sceneData += ""; } function exportScrollView(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nScrollView\n" + itemName + "\n"); sceneData += ("\n"); exportAllLayers(obj); sceneData += (""); var params = obj.name.split(":"); if (params.length > 2) { alert(obj.name + "-------Layer's name is illegal------------"); } var recSize; if (obj.layers[obj.layers.length - 1].name.search("@Size") < 0) { alert("Bottom layer's name doesn't contain '@Size'"); } else { obj.layers[obj.layers.length - 1].visible = true; recSize = getLayerRec(duppedPsd.duplicate()); sceneData += ""; sceneData += "" + recSize.x + ""; sceneData += "" + recSize.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + recSize.width + ""; sceneData += "" + recSize.height + ""; sceneData += ""; obj.layers[obj.layers.length - 1].visible = false; } //以下计算padding和spacing obj.layers[0].visible = true; showAllLayers(obj.layers[0]); //子图层组已经在上面导出过,要再次计算size需先将其显示 var rec0 = getLayerRec(duppedPsd.duplicate()); hideAllLayers(obj.layers[0]); obj.layers[0].visible = false; obj.layers[1].visible = true; showAllLayers(obj.layers[1]); var rec1 = getLayerRec(duppedPsd.duplicate()); hideAllLayers(obj.layers[0]); obj.layers[1].visible = false; var spacing; var paddingx; var paddingy; if(params[1].search("H") >= 0) //水平间距 { spacing = rec1.x - rec0.x - rec0.width; paddingx = rec0.x - (recSize.x - recSize.width / 2) - rec0.width / 2; //x方向边距,默认左右相等 paddingy = (recSize.height - rec0.height) / 2 ; //暂时只考虑上下边距相等 //paddingy = recSize.height / 2 - rec0.height / 2 - (rec0.y - recSize.y); //上边距 //paddingy2 = recSize.height - rec0.height - paddingy; //下边距 } else //垂直间距 { spacing = rec0.y - rec1.y - rec0.height; paddingx = (recSize.width - rec0.width) / 2 ; paddingy = (recSize.y + recSize.height / 2) - rec0.y - rec0.height / 2; } sceneData += ""; sceneData += "" + params[1] + ""; //滑动方向 sceneData += "" + spacing + ""; sceneData += "" + Math.floor (paddingx) + ""; sceneData += "" + Math.floor (paddingy) + ""; sceneData += ""; sceneData += ""; } function setLayerSizeAndPos(layer) { layer.visible = true; var recSize = getLayerRec(duppedPsd.duplicate()); sceneData += ""; sceneData += "" + recSize.x + ""; sceneData += "" + recSize.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + recSize.width + ""; sceneData += "" + recSize.height + ""; sceneData += ""; layer.visible = false; } function exportGrid(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nGrid\n" + itemName + "\n"); sceneData += ("\n"); exportAllLayers(obj); sceneData += (""); var params = obj.name.split(":"); if (params.length != 3) { alert("Layer's name is illegal"); } var recSize; if (obj.layers[obj.layers.length - 1].name.search("@Size") < 0) { alert("Bottom layer's name doesn't contain '@Size'"); } else { setLayerSizeAndPos(obj.layers[obj.layers.length - 1]); } var totalContentCount = obj.layers.length - 1; obj.layers[0].visible = true; showAllLayers(obj.layers[0]); //子图层组已经在上面导出过,要再次计算size需先将其显示 var rec0 = getLayerRec(duppedPsd.duplicate()); hideAllLayers(obj.layers[0]); obj.layers[0].visible = false; var renderHorizontalGap = params[2] > 1 ? (recSize.width - rec0.width * params[2])/(params[2] - 1) : 0; var renderVerticalGap = params[1] > 1 ? (recSize.height - rec0.height * params[1])/(params[1] - 1) : 0; sceneData += ""; sceneData += "" + params[1] + ""; //行数 sceneData += "" + params[2] + ""; //列数 sceneData += "" + rec0.width + ""; //render width sceneData += "" + rec0.height + ""; //render height sceneData += "" + Math.floor(renderHorizontalGap) + ""; //水平间距 sceneData += "" + Math.floor(renderVerticalGap) + ""; //垂直间距 sceneData += ""; sceneData += ""; } function exportGroup(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nGroup\n" + itemName + "\n"); exportAllLayers(obj); var params = obj.name.split(":"); if (params.length != 3 ) { alert(obj.name + "-------Layer's name not equals 2------------"); } var recSize; if (obj.layers[obj.layers.length - 1].name.search("@Size") < 0) { alert("Bottom layer's name doesn't contain '@Size'"); } else { obj.layers[obj.layers.length - 1].visible = true; recSize = getLayerRec(duppedPsd.duplicate()); sceneData += ""; sceneData += "" + recSize.x + ""; sceneData += "" + recSize.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + recSize.width + ""; sceneData += "" + recSize.height + ""; sceneData += ""; obj.layers[obj.layers.length - 1].visible = false; } sceneData += ""; sceneData += "" + params[1] + ""; //方向 sceneData += "" + params[2] + ""; //span sceneData += ""; sceneData += ""; } function exportInputField(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nInputField\n" + itemName + "\n"); sceneData += ""; // sceneData += "\n"; for (var i = obj.layers.length - 1; 0 <= i; i--) { exportArtLayer(obj.layers[i]); } sceneData += ""; // sceneData += "\n\n"; sceneData += "\n"; } function exportButton(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nButton\n" + itemName + "\n"); sceneData += ""; // sceneData += "\n"; for (var i = obj.layers.length - 1; 0 <= i; i--) { exportArtLayer(obj.layers[i]); } sceneData += ""; // sceneData += "\n\n"; sceneData += "\n"; } function exportToggle(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nToggle\n" + itemName + "\n"); sceneData += ""; // sceneData += "\n"; for (var i = obj.layers.length - 1; 0 <= i; i--) { exportArtLayer(obj.layers[i]); } sceneData += ""; // sceneData += "\n\n"; sceneData += "\n"; } function exportSlider(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nSlider\n" + itemName + "\n"); var params = obj.name.split(":"); if (params.length != 2) { alert(obj.name + "-------Layer's name is not 1 argument------------"); } var recSize; if (obj.layers[obj.layers.length - 1].name.search("@Size") < 0) { alert("Bottom layer's name doesn't contain '@Size'"); } else { setLayerSizeAndPos(obj.layers[obj.layers.length - 1]); } sceneData += ""; sceneData += "" + params[1] + ""; //滑动方向 sceneData += ""; // sceneData += "\n"; sceneData += ""; for (var i = obj.layers.length - 1; 0 <= i; i--) { exportArtLayer(obj.layers[i]); } sceneData += ""; // sceneData += "\n\n"; sceneData += "\n"; } function exportScrollBar(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nScrollBar\n" + itemName + "\n"); var params = obj.name.split(":"); if (params.length != 3) { alert(obj.name + "-------Layer's name is not 1 argument------------"); } sceneData += ""; sceneData += "" + params[1] + ""; //滑动方向 sceneData += "" + params[2] + ""; //比例 sceneData += ""; // sceneData += "\n"; sceneData += ""; for (var i = obj.layers.length - 1; 0 <= i; i--) { exportArtLayer(obj.layers[i]); } sceneData += ""; // sceneData += "\n\n"; sceneData += "\n"; } function exportPanel(obj) { var itemName = obj.name.substring(0, obj.name.search("@")); sceneData += ("\nPanel\n" + itemName + "\n"); exportAllLayers(obj); // sceneData += "\n"; sceneData += ""; for (var j = obj.artLayers.length - 1; 0 <= j; j--) { exportArtLayer(obj.artLayers[j]); } sceneData += ""; // sceneData += "\n\n"; sceneData += "\n"; } function exportArtLayer(obj) { if (typeof(obj) == "undefined") {return}; if (obj.name.search("@Size") >= 0) {return}; sceneData += "\n"; sceneData += "Normal"; //sceneData += "" + makeValidFileName(obj.name) + ""; var validFileName = makeValidFileName(obj.name); sceneData += "" + validFileName + ""; sceneData += "\n"; // sceneData += "\n"; if (LayerKind.TEXT == obj.kind) { exportLabel(obj,validFileName); } else if (obj.name.search("Texture") >= 0) { exportTexture(obj,validFileName); } else { exportImage(obj,validFileName); } sceneData += ""; // sceneData += ""; sceneData += "\n"; } function exportLabel(obj,validFileName) { //有些文本如标题,按钮,美术用的是其他字体,可能还加了各种样式,需要当做图片切出来使用 if(obj.name.search("_ArtStatic") >= 0) { exportImage(obj,validFileName); return; } //处理静态文本,会对应unity的静态字体 var StaticText = false; if(obj.name.search("_Static") >= 0) { StaticText = true; } sceneData += "" + "Label" + "\n"; //var validFileName = makeValidFileName(obj.name); sceneData += "" + validFileName + "\n"; obj.visible = true; saveScenePng(duppedPsd.duplicate(), validFileName, false); obj.visible = false; sceneData += ""; sceneData += "" + obj.textItem.color.rgb.hexValue + ""; if(StaticText == true) { sceneData += "" + obj.textItem.font + "_Static" + ""; } else { sceneData += "" + obj.textItem.font + ""; } //sceneData += "" + obj.textItem.font + ""; sceneData += "" + obj.textItem.size.value + ""; sceneData += "" + obj.textItem.contents + ""; //段落文本带文本框,可以取得对齐方式 if(obj.textItem.kind == TextType.PARAGRAPHTEXT) { sceneData += "" + obj.textItem.justification + ""; //加对齐方式 } sceneData += ""; } function exportTexture(obj,validFileName) { //var validFileName = makeValidFileName(obj.name); sceneData += "" + "Texture" + "\n"; sceneData += "" + validFileName + "\n"; obj.visible = true; saveScenePng(duppedPsd.duplicate(), validFileName, true); obj.visible = false; } function exportImage(obj,validFileName) { //var validFileName = makeValidFileName(obj.name); var oriName = obj.name sceneData += "" + validFileName + "\n"; if (obj.name.search("Common") >= 0) { sceneData += "" + "Common" + "\n"; } else if(obj.name.search("Global") >= 0) { sceneData += "" + "Global" + "\n"; } else { sceneData += "" + "Custom" + "\n"; } if (oriName.search("_9S") >= 0) { sceneData += "" + "SliceImage" + "\n"; obj.visible = true; var _objName = obj.name // var newDoc = app.documents.add(duppedPsd.width, duppedPsd.height,duppedPsd.resolution, _objName+"doc",NewDocumentMode.RGB,DocumentFill.TRANSPARENT) // app.activeDocument = duppedPsd // obj.copy() // app.activeDocument = newDoc // newDoc.paste() // newDoc.activeLayer.name = _objName var recSize = getLayerRec(duppedPsd.duplicate(),true); sceneData += ""; sceneData += "" + recSize.x + ""; sceneData += "" + recSize.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + recSize.width + ""; sceneData += "" + recSize.height + ""; sceneData += ""; // _9sliceCutImg(newDoc,_objName,validFileName); _9sliceCutImg(duppedPsd.duplicate(),_objName,validFileName); obj.visible = false; return; } else if(oriName.search("LeftHalf") > 0) //左右对称的图片切左边一半 { sceneData += "" + "LeftHalfImage" + "\n"; obj.visible = true; var recSize = getLayerRec(duppedPsd.duplicate()); sceneData += ""; sceneData += "" + recSize.x + ""; sceneData += "" + recSize.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + recSize.width + ""; sceneData += "" + recSize.height + ""; sceneData += ""; cutLeftHalf(duppedPsd.duplicate(),validFileName); obj.visible = false; return; } else if(obj.name.search("BottomHalf") > 0) //上下对称的图片切底部一半 { sceneData += "" + "BottomHalfImage" + "\n"; obj.visible = true; //半图要先计算出大小和位置 var recSize = getLayerRec(duppedPsd.duplicate()); sceneData += ""; sceneData += "" + recSize.x + ""; sceneData += "" + recSize.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + recSize.width + ""; sceneData += "" + recSize.height + ""; sceneData += ""; cutBottomHalf(duppedPsd.duplicate(),validFileName); obj.visible = false; return; } else if(obj.name.search("Quarter") > 0) //上下左右均对称的图片切左下四分之一 { sceneData += "" + "QuarterImage" + "\n"; obj.visible = true; var recSize = getLayerRec(duppedPsd.duplicate()); sceneData += ""; sceneData += "" + recSize.x + ""; sceneData += "" + recSize.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + recSize.width + ""; sceneData += "" + recSize.height + ""; sceneData += ""; cutQuarter(duppedPsd.duplicate(),validFileName); obj.visible = false; return; } else { sceneData += "" + "Image" + "\n"; } obj.visible = true; saveScenePng(duppedPsd.duplicate(), validFileName, true); obj.visible = false; } function hideAllLayers(obj) { hideLayerSets(obj); } function hideLayerSets(obj) { for (var i = obj.layers.length - 1; 0 <= i; i--) { if (obj.layers[i].typename == "LayerSet") { hideLayerSets(obj.layers[i]); } else { obj.layers[i].visible = false; } } } //显示图层组及组下所有图层 function showAllLayers(obj) { showLayerSets(obj); } function showLayerSets(obj) { for (var i = obj.layers.length - 1; 0 <= i; i--) { if (obj.layers[i].typename == "LayerSet") { showLayerSets(obj.layers[i]); } else { obj.layers[i].visible = true; } } } function getLayerRec(psd,notMerge) { // we should now have a single art layer if all went well if (!notMerge){ psd.mergeVisibleLayers(); } // figure out where the top-left corner is so it can be exported into the scene file for placement in game // capture current size var height = psd.height.value; var width = psd.width.value; var top = psd.height.value; var left = psd.width.value; // trim off the top and left psd.trim(TrimType.TRANSPARENT, true, true, false, false); // the difference between original and trimmed is the amount of offset top -= psd.height.value; left -= psd.width.value; // trim the right and bottom psd.trim(TrimType.TRANSPARENT); // find center top += (psd.height.value / 2) left += (psd.width.value / 2) // unity needs center of image, not top left top = -(top - (height / 2)); left -= (width / 2); height = psd.height.value; width = psd.width.value; psd.close(SaveOptions.DONOTSAVECHANGES); return { y: top, x: left, width: width, height: height }; } function saveScenePng(psd, fileName, writeToDisk,notMerge) { // we should now have a single art layer if all went well if(!notMerge) { psd.mergeVisibleLayers(); } // figure out where the top-left corner is so it can be exported into the scene file for placement in game // capture current size var height = psd.height.value; var width = psd.width.value; var top = psd.height.value; var left = psd.width.value; // trim off the top and left psd.trim(TrimType.TRANSPARENT, true, true, false, false); // the difference between original and trimmed is the amount of offset top -= psd.height.value; left -= psd.width.value; // trim the right and bottom psd.trim(TrimType.TRANSPARENT); // find center top += (psd.height.value / 2) left += (psd.width.value / 2) // unity needs center of image, not top left top = -(top - (height / 2)); left -= (width / 2); height = psd.height.value; width = psd.width.value; var rec = { y: top, x: left, width: width, height: height }; // save the scene data if(!notMerge){ sceneData += ""; sceneData += "" + rec.x + ""; sceneData += "" + rec.y + ""; sceneData += ""; sceneData += ""; sceneData += "" + rec.width + ""; sceneData += "" + rec.height + ""; sceneData += ""; } if (writeToDisk) { // save the image var pngFile = new File(destinationFolder + "/" + fileName + ".png"); var pngSaveOptions = new PNGSaveOptions(); psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE); } psd.close(SaveOptions.DONOTSAVECHANGES); } function makeValidFileName(fileName) { var validName = fileName.replace(/^\s+|\s+$/gm, ''); // trim spaces //删除九宫格关键字符 validName = validName.replace(/\s*_9S(\:\d+)+/g,"") validName = validName.replace(/[\\\*\/\?:"\|<>]/g, ''); // remove characters not allowed in a file name validName = validName.replace(/[ ]/g, '_'); // replace spaces with underscores, since some programs still may have troubles with them if (validName.match("Common") || validName.match("Global")) { validName = validName.substring (0,validName.lastIndexOf ("@")); //截取@之后的字符串作为图片的名称。 } else if(!sourcePsdName.match("Common") || !sourcePsdName.match("Global")) // 判断是否为公用的PSD素材文件,如果不是,则自动为图片增加后缀,防止重名。 公用psd文件的图片层不允许重名。 { validName += "_" + uuid++; } $.writeln(validName); return validName; } /***************************************************************************************************************************************************************************************************************/ //对称的图片处理,切一半 //2017.01.10 //by zs // 裁切 基于透明像素 function trim(doc){ doc.trim(TrimType.TRANSPARENT,true,true,true,true); } // 裁剪左半部分 function cutLeftHalf(doc,layerName){ doc.mergeVisibleLayers(); trim(doc); var _obj = doc.activeLayer var width = doc.width; var height = doc.height; var side = width / 2; var region = Array(Array(0,height),Array(0,0),Array(side,0),Array(side,height)); var selectRect = doc.selection.select(region); doc.selection.copy(); var newStem = doc.paste(); newStem.name = layerName; var deltaX = 0; var deltaY = 0; if(region[0][0] != 0){ deltaX = -(width - side*2); } newStem.translate(deltaX,deltaY); _obj.visible = false; trim(doc); saveScenePng(doc, layerName, true,true); // exportHalfImage(doc,"LeftHalf"); } // 裁剪下半部分 function cutBottomHalf(doc,layerName){ doc.mergeVisibleLayers(); trim(doc); var _obj = doc.activeLayer var width = doc.width; var height = doc.height; var side = height / 2; //var region = Array(Array(0,side),Array(0,0),Array(width,0),Array(width,side)); var region = Array(Array(0,height),Array(0,side),Array(width,side),Array(width,height)); var selectRect = doc.selection.select(region); doc.selection.copy(); var newStem = doc.paste(); newStem.name = layerName; var deltaX = 0; var deltaY = 0; if (region[0][1] != side){ deltaY = -(height - side*2); } newStem.translate(deltaX,deltaY); _obj.visible = false; trim(doc); saveScenePng(doc, layerName, true,true); //exportHalfImage(doc,"UpHalf"); } // 裁剪左下四分之一 function cutQuarter(doc,layerName){ doc.mergeVisibleLayers(); trim(doc); var _obj = doc.activeLayer var width = doc.width; var height = doc.height; var side = height / 2; var region = Array(Array(0,height),Array(0,height / 2),Array(width / 2,height / 2),Array(width / 2,height)); var selectRect = doc.selection.select(region); doc.selection.copy(); var newStem = doc.paste(); newStem.name = layerName; var deltaX = 0; var deltaY = 0; if (region[0][1] != side){ deltaY = -(height - side*2); } newStem.translate(deltaX,deltaY); _obj.visible = false; trim(doc); saveScenePng(doc, layerName, true,true); } function exportHalfImage(psd,halfType) { hideAllLayers(psd); var layerName = ""; for (var i = psd.layers.length - 1; 0 <= i; i--) { layerName = psd.layers[i].name; if(layerName.match(halfType)) { psd.layers[i].visible = true; saveScenePng(psd, layerName, true,true); } } } /***************************************************************************************************************************************************************************************************************/ //九宫格切图 //2017.01.13 //by HuangLang function _9sliceCutImg(doc,layerName,vaildName){ // 创建图层组 var _obj = doc.activeLayer var stemGroup = doc.layerSets.add(); stemGroup.name = layerName // _obj.move(stemGroup,ElementPlacement.PLACEATEND) doc.mergeVisibleLayers(); trim(doc); var width = doc.width; var height = doc.height; var re = /\s*_9S(\:\d+)+/g; var getStr = "" var result = layerName.match(re) if (result) { getStr = result[0] }else{ alert("图层名为:"+layerName+"的九宫格格式不对!应为_9S:XX或:XX:XX:XX:XX"); return; } var nums = getStr.split(":") if ( nums.length == 2) { for(var j = 0;j"; sceneData += "" + sliceOriArr[1] + ""; sceneData += "" + sliceOriArr[2] + ""; sceneData += "" + sliceOriArr[3] + ""; sceneData += ""; trim(doc); saveScenePng(doc, vaildName, true,true); }