@VariableD
2018-02-08T09:07:38.000000Z
字数 9744
阅读 2616
PS脚本
/*将特定文字层的文字进行替换并导出成多个PNG文件的脚本//Photoshop CS 5.1下测试可用,不确定是否兼容旧版//by VariableD//改造加工自由,转载随意步骤:1.打开一个PSD文件,并且选中一个文字图层2.选择记录了文字内容的TXT3.开始执行,将会依次把TXT内的每一行替换到特定文字层,并保存成PNG。格式为:导出时保存成的文件名,要写的第一个版本文字内容,第二个版本(如英文)的文字内容,第N个版本……4.当完成时会弹框提示用法示例:·一个按钮PSD·一个TXT内有文件名和“保存、读取、系统、退出”等等字样·将按照按钮的文字样式生成“保存、读取、系统、退出”等按钮的PNG图片主要是用来批量制造统一文字样式的多语言版按钮图片的*///定义全局变数var destinationFolder; //目标文件夹var listTXTpath;//记载有文字内容的TXTvar sourcePsd; //原PSDvar sourceLayer; //原图层//判断是否存在文件和导出目录main();// main entry pointfunction main(){// got a valid document?if( app.documents.length <= 0 ){if(app.playbackDisplayDialogs != DialogModes.NO){alert("至少需要打开一个文件哦!");}// quit, returning 'cancel' makes the actions palette not record our scriptreturn 'cancel';}// ask for where the exported files should godestinationFolder = Folder.selectDialog("请选择导出目录:");if(!destinationFolder){return;}// cache useful variablessourcePsd=app.activeDocument;sourcePsdName = sourcePsd.name; //取得当前文件名sourceLayer=app.activeDocument.activeLayer;if (sourceLayer.kind == LayerKind.TEXT){var text=sourceLayer.textItem.contents;//alert(text);listTXTpath= File.openDialog("请选择记录有替换文字的TXT文件", "TEXT Files:*.TXT");if(!listTXTpath){return;}else{/* 开启档案 */var txtFile = new File(listTXTpath);if (!txtFile.open("r","","")){alert("打不开TXT"); return;}/* 读取内容 */var row;var i=0;while(row=txtFile.readln()){//alert(row);//取得数组var arr=row.split(",");var j;for (j=1;j<arr.length;j++){//一行存在多列文字,输出成分文件夹if (arr.length>2) changeText(arr[j],arr[0],"image"+j);//只存在一列文字,输出到images文件夹else changeText(arr[j],arr[0],"image");}i++;}alert("搞定啦~");}}else{alert("选择的不是文字图层哟~");}}//替换文字内容function changeText(mytext,filename,folder){sourceLayer.textItem.contents=mytext;exportAndSave(sourcePsd, filename,folder);}//导出并保存图片function exportAndSave(psd, fileName,folder){var folderpath = Folder(destinationFolder + "/"+folder+"/");//Check if it exist, if not create it.if(!folderpath.exists) folderpath.create();// save the imagevar pngFile = new File(destinationFolder + "/"+folder+"/" + fileName + ".png");var pngSaveOptions = new PNGSaveOptions();psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);}
//从多图层PSD导出成联排动画的脚本//Photoshop CS 5.1下测试可用,不确定是否兼容旧版//by VariableD//改造加工自由,转载随意//干嘛的?//(1)你做了一个N帧的动画,他们现在在一个PSD里以N个图层的形式存在//(2)你用的游戏工具需要的不是N张图,而是上面有N格的1张图//(3)你肯定不想新建一个PSD然后一格格往里贴,更别提这种贴法在透明背景的时候很可能导致错位//(4)你现在知道这东西是做什么用的了……//使用方法为://(1)打开要处理的PSD文件,之后点击文件->脚本->浏览//(2)选中这个脚本,会自动新建一个PSD文件,并将原文件的图层按照顺序横向排列//※新建PSD文件的宽度是原来那个文件的宽度x图层数,高度和原来一样//※可以改造成每行X个,一共Y行这种……不过等有需要再说//定义全局变数var sourcePsd; //原PSDvar asdPsd; //复制出的新PSDmain();// main entry pointfunction main(){// got a valid document?if( app.documents.length <= 0 ){if(app.playbackDisplayDialogs != DialogModes.NO){alert("至少需要打开一个文件哦!");}// quit, returning 'cancel' makes the actions palette not record our scriptreturn 'cancel';}// cache useful variablessourcePsd=app.activeDocument;sourcePsdName = app.activeDocument.name; //取得当前文件名var layerCount = app.documents[sourcePsdName].layers.length; //取得图层总数//var layerSetsCount = app.documents[sourcePsdName].layerSets.length; //取得图层组总数//alert("共有"+layerCount+"个图层,"+layerSetsCount+"个图层组");//判断文件内容是否符合导出需求if(layerCount <= 1){if(app.playbackDisplayDialogs != DialogModes.NO){alert("至少要有2个图层的说。");// quit, returning 'cancel' makes the actions palette not record our scriptreturn 'cancel';}}var f_width= UnitValue(app.documents[sourcePsdName].width.as("px"),"px");var f_height=UnitValue(app.documents[sourcePsdName].height.as("px"),"px");//alert(f_width+","+f_height);//新建一个PSD//asdPsd=app.documents.add(f_width*layerCount, f_height, 72.0, sourcePsdName+"_a", NewDocumentMode.RGB, DocumentFill.TRANSPARENT);//如果在某些PS版本下会出错则用下面这行取代上面这行asdPsd=app.documents.add(f_width*layerCount, f_height);//将源文档设定为激活文档app.activeDocument=sourcePsd;for (var i=0; i<layerCount;i++){//拷贝源文档对应图层到新文档sourcePsd.layers[i].duplicate(asdPsd);}//激活新文档app.activeDocument=asdPsd;for (var i=0; i<layerCount;i++){//选中当前图层asdPsd.activeLayer=asdPsd.layers[i];//移动到指定位置asdPsd.layers[i].translate(f_width*i, 0);}}
//从PSD角色文件导出成角色立绘的PNG系列图//Photoshop CS 5.1下测试可用,不确定是否兼容旧版//by VariableD//改造加工自由,转载随意//使用方法为://(1)打开要导出的PSD文件,之后点击文件->脚本->浏览//(2)选择要导出到的文件夹//(3)会按照“PSD文件名_服装名_表情名”的格式,导出成PNG//PSD文件的格式://(1)至少要有一个不属于任何图层组的图层,作为固定显示的素体//(2)至少要有两个图层组,其中一个包含所有的服装差分,另外一个包含所有的表情差分//(3)所有不属于任何图层组的图层,将会当做固定的部件(例如眼镜)//(4)除了服装、表情(从下往上数的第一、二个图层组)以外,其他的图层组会被无视,不参与导出//(5)如果没有服装差分的话,服装的图层组里可以放张透明的图层……//定义全局变数var destinationFolder; //目标文件夹var sourcePsd; //原PSDvar duppedPsd; //复制出的新PSD//判断是否存在文件和导出目录main();// main entry pointfunction main(){// got a valid document?if( app.documents.length <= 0 ){if(app.playbackDisplayDialogs != DialogModes.NO){alert("至少需要打开一个文件哦!");}// quit, returning 'cancel' makes the actions palette not record our scriptreturn 'cancel';}// ask for where the exported files should godestinationFolder = Folder.selectDialog("请选择导出目录:");if(!destinationFolder){return;}// cache useful variablessourcePsdName = app.activeDocument.name; //取得当前文件名var layerCount = app.documents[sourcePsdName].layers.length; //取得图层总数var layerSetsCount = app.documents[sourcePsdName].layerSets.length; //取得图层组总数//alert("共有"+layerCount+"个图层,"+layerSetsCount+"个图层组");//判断文件内容是否符合导出需求if((layerCount == 0)&&(layerSetsCount <= 1)){if(app.playbackDisplayDialogs != DialogModes.NO){alert("至少要有1个固定图层(素体)和2个图层组(服装、表情)的说。");// quit, returning 'cancel' makes the actions palette not record our scriptreturn 'cancel';}}// 复制这个PSD,这样我们就可以不动原文件,随便搞它了duppedPsd = app.activeDocument.duplicate();duppedPsd.activeLayer = duppedPsd.layers[duppedPsd.layers.length-1]; //将底层作为activelayer//先隐藏所有的图层和图层组hideAllArtLayers(duppedPsd);//将没有在组内的图层都显示出来(素体、头发等)showAllArtLayers(duppedPsd);//循环输出图层组的排列组合//服装(从下往上数,第1个图层组)var clothGroup = duppedPsd.layerSets[duppedPsd.layerSets.length-1];//表情(从下往上数,第2个图层组)var emoGroup = duppedPsd.layerSets[duppedPsd.layerSets.length-2];for (var i=0; i<clothGroup.artLayers.length;i++){//显示衣服clothGroup.artLayers[i].visible=true;//导出表情for (var j=0 ; j<emoGroup.artLayers.length;j++){emoGroup.artLayers[j].visible=true;//var filename=sourcePsdName.replace(/\.[^\.]+$/, '')+"_"+clothGroup.artLayers[i].name+"_"+emoGroup.artLayers[j].name;var filename=""+clothGroup.artLayers[i].name+emoGroup.artLayers[j].name;exportAndSave(duppedPsd,filename);emoGroup.artLayers[j].visible=false;}//隐藏衣服clothGroup.artLayers[i].visible=false;}//处理完毕后,关闭复制的PSDduppedPsd.close(SaveOptions.DONOTSAVECHANGES);}//隐藏所有图层、图层组function hideAllArtLayers(obj){for(var i = 0; i < obj.artLayers.length; i++){obj.artLayers[i].allLocked = false;obj.artLayers[i].visible = false;}for( var i = 0; i < obj.layerSets.length; i++){hideAllArtLayers(obj.layerSets[i]);}}//显示所有图层function showAllArtLayers(obj){for(var i = 0; i < obj.artLayers.length; i++){obj.artLayers[i].visible = true;}}//导出并保存图片function exportAndSave(psd, fileName){// save the imagevar pngFile = new File(destinationFolder + "/" + fileName + ".png");var pngSaveOptions = new PNGSaveOptions();psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);}
//从PSD角色文件导出成角色立绘的PNG系列图//Photoshop CS 5.1下测试可用,不确定是否兼容旧版//by VariableD//改造加工自由,转载随意//使用方法为://(1)打开要导出的PSD文件,之后点击文件->脚本->浏览//(2)选择要导出到的文件夹//(3)会按照“PSD文件名_服装名_表情名”的格式,导出成PNG//PSD文件的格式://(1)至少要有一个不属于任何图层组的图层,作为固定显示的素体//(2)至少要有两个图层组,其中一个包含所有的服装差分,另外一个包含所有的表情差分//(3)所有不属于任何图层组的图层,将会当做固定的部件(例如眼镜)//(4)除了服装、表情(从下往上数的第一、二个图层组)以外,其他的图层组会被无视,不参与导出//(5)如果没有服装差分的话,服装的图层组里可以放张透明的图层……//定义全局变数var destinationFolder; //目标文件夹var sourcePsd; //原PSDvar duppedPsd; //复制出的新PSD//判断是否存在文件和导出目录main();// main entry pointfunction main(){// got a valid document?if( app.documents.length <= 0 ){if(app.playbackDisplayDialogs != DialogModes.NO){alert("至少需要打开一个文件哦!");}// quit, returning 'cancel' makes the actions palette not record our scriptreturn 'cancel';}// ask for where the exported files should godestinationFolder = Folder.selectDialog("请选择导出目录:");if(!destinationFolder){return;}// cache useful variablessourcePsdName = app.activeDocument.name; //取得当前文件名var layerCount = app.documents[sourcePsdName].layers.length; //取得图层总数var layerSetsCount = app.documents[sourcePsdName].layerSets.length; //取得图层组总数//alert("共有"+layerCount+"个图层,"+layerSetsCount+"个图层组");//判断文件内容是否符合导出需求if((layerCount == 0)&&(layerSetsCount <= 1)){if(app.playbackDisplayDialogs != DialogModes.NO){alert("至少要有1个固定图层和2个图层组(服装、表情)的说。");// quit, returning 'cancel' makes the actions palette not record our scriptreturn 'cancel';}}// 复制这个PSD,这样我们就可以不动原文件,随便搞它了duppedPsd = app.activeDocument.duplicate();duppedPsd.activeLayer = duppedPsd.layers[duppedPsd.layers.length-1]; //将底层作为activelayer//先隐藏所有的图层和图层组hideAllArtLayers(duppedPsd);//将没有在组内的图层都显示出来(素体、头发等)showAllArtLayers(duppedPsd);//循环输出图层组的排列组合//服装(从下往上数,第一个图层组)var clothGroup = duppedPsd.layerSets[duppedPsd.layerSets.length-1];alert(clothGroup.name);//表情(从下往上数,第二个图层组)var emoGroup = duppedPsd.layerSets[duppedPsd.layerSets.length-2];alert(emoGroup.name);for (var i=0; i<clothGroup.artLayers.length;i++){//显示衣服clothGroup.artLayers[i].visible=true;//导出表情for (var j=0 ; j<emoGroup.layerSets.length;j++){//显示一个表情组以及组里的全部图层emoGroup.layerSets[j].visible=true;showAllArtLayers(emoGroup.layerSets[j]);//var filename=sourcePsdName.replace(/\.[^\.]+$/, '')+"_"+clothGroup.artLayers[i].name+"_"+emoGroup.layerSets[j].name;var filename=""+clothGroup.artLayers[i].name+emoGroup.layerSets[j].name;exportAndSave(duppedPsd,filename);//隐藏这个表情组emoGroup.layerSets[j].visible=false;}//隐藏衣服clothGroup.artLayers[i].visible=false;}//处理完毕后,关闭复制的PSDduppedPsd.close(SaveOptions.DONOTSAVECHANGES);}//隐藏所有图层、图层组function hideAllArtLayers(obj){for(var i = 0; i < obj.artLayers.length; i++){obj.artLayers[i].allLocked = false;obj.artLayers[i].visible = false;}for( var i = 0; i < obj.layerSets.length; i++){hideAllArtLayers(obj.layerSets[i]);}}//显示所有图层function showAllArtLayers(obj){for(var i = 0; i < obj.artLayers.length; i++){obj.artLayers[i].visible = true;}}//显示图层组里的图片function exportAndSave(psd, fileName){// save the imagevar pngFile = new File(destinationFolder + "/" + fileName + ".png");var pngSaveOptions = new PNGSaveOptions();psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);}