@VariableD
2018-02-08T09:07:38.000000Z
字数 9744
阅读 2311
PS脚本
/*
将特定文字层的文字进行替换并导出成多个PNG文件的脚本
//Photoshop CS 5.1下测试可用,不确定是否兼容旧版
//by VariableD
//改造加工自由,转载随意
步骤:
1.打开一个PSD文件,并且选中一个文字图层
2.选择记录了文字内容的TXT
3.开始执行,将会依次把TXT内的每一行替换到特定文字层,并保存成PNG。格式为:导出时保存成的文件名,要写的第一个版本文字内容,第二个版本(如英文)的文字内容,第N个版本……
4.当完成时会弹框提示
用法示例:
·一个按钮PSD
·一个TXT内有文件名和“保存、读取、系统、退出”等等字样
·将按照按钮的文字样式生成“保存、读取、系统、退出”等按钮的PNG图片
主要是用来批量制造统一文字样式的多语言版按钮图片的
*/
//定义全局变数
var destinationFolder; //目标文件夹
var listTXTpath;//记载有文字内容的TXT
var sourcePsd; //原PSD
var sourceLayer; //原图层
//判断是否存在文件和导出目录
main();
// main entry point
function 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 script
return 'cancel';
}
// ask for where the exported files should go
destinationFolder = Folder.selectDialog("请选择导出目录:");
if(!destinationFolder)
{
return;
}
// cache useful variables
sourcePsd=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 image
var 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; //原PSD
var asdPsd; //复制出的新PSD
main();
// main entry point
function 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 script
return 'cancel';
}
// cache useful variables
sourcePsd=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 script
return '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; //原PSD
var duppedPsd; //复制出的新PSD
//判断是否存在文件和导出目录
main();
// main entry point
function 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 script
return 'cancel';
}
// ask for where the exported files should go
destinationFolder = Folder.selectDialog("请选择导出目录:");
if(!destinationFolder)
{
return;
}
// cache useful variables
sourcePsdName = 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 script
return '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;
}
//处理完毕后,关闭复制的PSD
duppedPsd.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 image
var 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; //原PSD
var duppedPsd; //复制出的新PSD
//判断是否存在文件和导出目录
main();
// main entry point
function 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 script
return 'cancel';
}
// ask for where the exported files should go
destinationFolder = Folder.selectDialog("请选择导出目录:");
if(!destinationFolder)
{
return;
}
// cache useful variables
sourcePsdName = 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 script
return '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;
}
//处理完毕后,关闭复制的PSD
duppedPsd.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 image
var pngFile = new File(destinationFolder + "/" + fileName + ".png");
var pngSaveOptions = new PNGSaveOptions();
psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);
}