[关闭]
@VariableD 2018-02-08T09:07:38.000000Z 字数 9744 阅读 2311

PhotoShop Script

PS脚本


(1)根据TXT文件批量导出文字图片

  1. /*
  2. 将特定文字层的文字进行替换并导出成多个PNG文件的脚本
  3. //Photoshop CS 5.1下测试可用,不确定是否兼容旧版
  4. //by VariableD
  5. //改造加工自由,转载随意
  6. 步骤:
  7. 1.打开一个PSD文件,并且选中一个文字图层
  8. 2.选择记录了文字内容的TXT
  9. 3.开始执行,将会依次把TXT内的每一行替换到特定文字层,并保存成PNG。格式为:导出时保存成的文件名,要写的第一个版本文字内容,第二个版本(如英文)的文字内容,第N个版本……
  10. 4.当完成时会弹框提示
  11. 用法示例:
  12. ·一个按钮PSD
  13. ·一个TXT内有文件名和“保存、读取、系统、退出”等等字样
  14. ·将按照按钮的文字样式生成“保存、读取、系统、退出”等按钮的PNG图片
  15. 主要是用来批量制造统一文字样式的多语言版按钮图片的
  16. */
  17. //定义全局变数
  18. var destinationFolder; //目标文件夹
  19. var listTXTpath;//记载有文字内容的TXT
  20. var sourcePsd; //原PSD
  21. var sourceLayer; //原图层
  22. //判断是否存在文件和导出目录
  23. main();
  24. // main entry point
  25. function main()
  26. {
  27. // got a valid document?
  28. if( app.documents.length <= 0 )
  29. {
  30. if(app.playbackDisplayDialogs != DialogModes.NO)
  31. {
  32. alert("至少需要打开一个文件哦!");
  33. }
  34. // quit, returning 'cancel' makes the actions palette not record our script
  35. return 'cancel';
  36. }
  37. // ask for where the exported files should go
  38. destinationFolder = Folder.selectDialog("请选择导出目录:");
  39. if(!destinationFolder)
  40. {
  41. return;
  42. }
  43. // cache useful variables
  44. sourcePsd=app.activeDocument;
  45. sourcePsdName = sourcePsd.name; //取得当前文件名
  46. sourceLayer=app.activeDocument.activeLayer;
  47. if (sourceLayer.kind == LayerKind.TEXT)
  48. {
  49. var text=sourceLayer.textItem.contents;
  50. //alert(text);
  51. listTXTpath= File.openDialog("请选择记录有替换文字的TXT文件", "TEXT Files:*.TXT");
  52. if(!listTXTpath)
  53. {
  54. return;
  55. }
  56. else
  57. {
  58. /* 开启档案 */
  59. var txtFile = new File(listTXTpath);
  60. if (!txtFile.open("r","",""))
  61. {
  62. alert("打不开TXT"); return;
  63. }
  64. /* 读取内容 */
  65. var row;
  66. var i=0;
  67. while(row=txtFile.readln())
  68. {
  69. //alert(row);
  70. //取得数组
  71. var arr=row.split(",");
  72. var j;
  73. for (j=1;j<arr.length;j++)
  74. {
  75. //一行存在多列文字,输出成分文件夹
  76. if (arr.length>2) changeText(arr[j],arr[0],"image"+j);
  77. //只存在一列文字,输出到images文件夹
  78. else changeText(arr[j],arr[0],"image");
  79. }
  80. i++;
  81. }
  82. alert("搞定啦~");
  83. }
  84. }
  85. else
  86. {
  87. alert("选择的不是文字图层哟~");
  88. }
  89. }
  90. //替换文字内容
  91. function changeText(mytext,filename,folder)
  92. {
  93. sourceLayer.textItem.contents=mytext;
  94. exportAndSave(sourcePsd, filename,folder);
  95. }
  96. //导出并保存图片
  97. function exportAndSave(psd, fileName,folder)
  98. {
  99. var folderpath = Folder(destinationFolder + "/"+folder+"/");
  100. //Check if it exist, if not create it.
  101. if(!folderpath.exists) folderpath.create();
  102. // save the image
  103. var pngFile = new File(destinationFolder + "/"+folder+"/" + fileName + ".png");
  104. var pngSaveOptions = new PNGSaveOptions();
  105. psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);
  106. }

(2)导出联排动画

  1. //从多图层PSD导出成联排动画的脚本
  2. //Photoshop CS 5.1下测试可用,不确定是否兼容旧版
  3. //by VariableD
  4. //改造加工自由,转载随意
  5. //干嘛的?
  6. //(1)你做了一个N帧的动画,他们现在在一个PSD里以N个图层的形式存在
  7. //(2)你用的游戏工具需要的不是N张图,而是上面有N格的1张图
  8. //(3)你肯定不想新建一个PSD然后一格格往里贴,更别提这种贴法在透明背景的时候很可能导致错位
  9. //(4)你现在知道这东西是做什么用的了……
  10. //使用方法为:
  11. //(1)打开要处理的PSD文件,之后点击文件->脚本->浏览
  12. //(2)选中这个脚本,会自动新建一个PSD文件,并将原文件的图层按照顺序横向排列
  13. //※新建PSD文件的宽度是原来那个文件的宽度x图层数,高度和原来一样
  14. //※可以改造成每行X个,一共Y行这种……不过等有需要再说
  15. //定义全局变数
  16. var sourcePsd; //原PSD
  17. var asdPsd; //复制出的新PSD
  18. main();
  19. // main entry point
  20. function main()
  21. {
  22. // got a valid document?
  23. if( app.documents.length <= 0 )
  24. {
  25. if(app.playbackDisplayDialogs != DialogModes.NO)
  26. {
  27. alert("至少需要打开一个文件哦!");
  28. }
  29. // quit, returning 'cancel' makes the actions palette not record our script
  30. return 'cancel';
  31. }
  32. // cache useful variables
  33. sourcePsd=app.activeDocument;
  34. sourcePsdName = app.activeDocument.name; //取得当前文件名
  35. var layerCount = app.documents[sourcePsdName].layers.length; //取得图层总数
  36. //var layerSetsCount = app.documents[sourcePsdName].layerSets.length; //取得图层组总数
  37. //alert("共有"+layerCount+"个图层,"+layerSetsCount+"个图层组");
  38. //判断文件内容是否符合导出需求
  39. if(layerCount <= 1)
  40. {
  41. if(app.playbackDisplayDialogs != DialogModes.NO)
  42. {
  43. alert("至少要有2个图层的说。");
  44. // quit, returning 'cancel' makes the actions palette not record our script
  45. return 'cancel';
  46. }
  47. }
  48. var f_width= UnitValue(app.documents[sourcePsdName].width.as("px"),"px");
  49. var f_height=UnitValue(app.documents[sourcePsdName].height.as("px"),"px");
  50. //alert(f_width+","+f_height);
  51. //新建一个PSD
  52. //asdPsd=app.documents.add(f_width*layerCount, f_height, 72.0, sourcePsdName+"_a", NewDocumentMode.RGB, DocumentFill.TRANSPARENT);
  53. //如果在某些PS版本下会出错则用下面这行取代上面这行
  54. asdPsd=app.documents.add(f_width*layerCount, f_height);
  55. //将源文档设定为激活文档
  56. app.activeDocument=sourcePsd;
  57. for (var i=0; i<layerCount;i++)
  58. {
  59. //拷贝源文档对应图层到新文档
  60. sourcePsd.layers[i].duplicate(asdPsd);
  61. }
  62. //激活新文档
  63. app.activeDocument=asdPsd;
  64. for (var i=0; i<layerCount;i++)
  65. {
  66. //选中当前图层
  67. asdPsd.activeLayer=asdPsd.layers[i];
  68. //移动到指定位置
  69. asdPsd.layers[i].translate(f_width*i, 0);
  70. }
  71. }

(3)导出角色表情/服装差分立绘的PNG系列

  1. //从PSD角色文件导出成角色立绘的PNG系列图
  2. //Photoshop CS 5.1下测试可用,不确定是否兼容旧版
  3. //by VariableD
  4. //改造加工自由,转载随意
  5. //使用方法为:
  6. //(1)打开要导出的PSD文件,之后点击文件->脚本->浏览
  7. //(2)选择要导出到的文件夹
  8. //(3)会按照“PSD文件名_服装名_表情名”的格式,导出成PNG
  9. //PSD文件的格式:
  10. //(1)至少要有一个不属于任何图层组的图层,作为固定显示的素体
  11. //(2)至少要有两个图层组,其中一个包含所有的服装差分,另外一个包含所有的表情差分
  12. //(3)所有不属于任何图层组的图层,将会当做固定的部件(例如眼镜)
  13. //(4)除了服装、表情(从下往上数的第一、二个图层组)以外,其他的图层组会被无视,不参与导出
  14. //(5)如果没有服装差分的话,服装的图层组里可以放张透明的图层……
  15. //定义全局变数
  16. var destinationFolder; //目标文件夹
  17. var sourcePsd; //原PSD
  18. var duppedPsd; //复制出的新PSD
  19. //判断是否存在文件和导出目录
  20. main();
  21. // main entry point
  22. function main()
  23. {
  24. // got a valid document?
  25. if( app.documents.length <= 0 )
  26. {
  27. if(app.playbackDisplayDialogs != DialogModes.NO)
  28. {
  29. alert("至少需要打开一个文件哦!");
  30. }
  31. // quit, returning 'cancel' makes the actions palette not record our script
  32. return 'cancel';
  33. }
  34. // ask for where the exported files should go
  35. destinationFolder = Folder.selectDialog("请选择导出目录:");
  36. if(!destinationFolder)
  37. {
  38. return;
  39. }
  40. // cache useful variables
  41. sourcePsdName = app.activeDocument.name; //取得当前文件名
  42. var layerCount = app.documents[sourcePsdName].layers.length; //取得图层总数
  43. var layerSetsCount = app.documents[sourcePsdName].layerSets.length; //取得图层组总数
  44. //alert("共有"+layerCount+"个图层,"+layerSetsCount+"个图层组");
  45. //判断文件内容是否符合导出需求
  46. if((layerCount == 0)&&(layerSetsCount <= 1))
  47. {
  48. if(app.playbackDisplayDialogs != DialogModes.NO)
  49. {
  50. alert("至少要有1个固定图层(素体)和2个图层组(服装、表情)的说。");
  51. // quit, returning 'cancel' makes the actions palette not record our script
  52. return 'cancel';
  53. }
  54. }
  55. // 复制这个PSD,这样我们就可以不动原文件,随便搞它了
  56. duppedPsd = app.activeDocument.duplicate();
  57. duppedPsd.activeLayer = duppedPsd.layers[duppedPsd.layers.length-1]; //将底层作为activelayer
  58. //先隐藏所有的图层和图层组
  59. hideAllArtLayers(duppedPsd);
  60. //将没有在组内的图层都显示出来(素体、头发等)
  61. showAllArtLayers(duppedPsd);
  62. //循环输出图层组的排列组合
  63. //服装(从下往上数,第1个图层组)
  64. var clothGroup = duppedPsd.layerSets[duppedPsd.layerSets.length-1];
  65. //表情(从下往上数,第2个图层组)
  66. var emoGroup = duppedPsd.layerSets[duppedPsd.layerSets.length-2];
  67. for (var i=0; i<clothGroup.artLayers.length;i++)
  68. {
  69. //显示衣服
  70. clothGroup.artLayers[i].visible=true;
  71. //导出表情
  72. for (var j=0 ; j<emoGroup.artLayers.length;j++)
  73. {
  74. emoGroup.artLayers[j].visible=true;
  75. //var filename=sourcePsdName.replace(/\.[^\.]+$/, '')+"_"+clothGroup.artLayers[i].name+"_"+emoGroup.artLayers[j].name;
  76. var filename=""+clothGroup.artLayers[i].name+emoGroup.artLayers[j].name;
  77. exportAndSave(duppedPsd,filename);
  78. emoGroup.artLayers[j].visible=false;
  79. }
  80. //隐藏衣服
  81. clothGroup.artLayers[i].visible=false;
  82. }
  83. //处理完毕后,关闭复制的PSD
  84. duppedPsd.close(SaveOptions.DONOTSAVECHANGES);
  85. }
  86. //隐藏所有图层、图层组
  87. function hideAllArtLayers(obj)
  88. {
  89. for(var i = 0; i < obj.artLayers.length; i++)
  90. {
  91. obj.artLayers[i].allLocked = false;
  92. obj.artLayers[i].visible = false;
  93. }
  94. for( var i = 0; i < obj.layerSets.length; i++)
  95. {
  96. hideAllArtLayers(obj.layerSets[i]);
  97. }
  98. }
  99. //显示所有图层
  100. function showAllArtLayers(obj)
  101. {
  102. for(var i = 0; i < obj.artLayers.length; i++)
  103. {
  104. obj.artLayers[i].visible = true;
  105. }
  106. }
  107. //导出并保存图片
  108. function exportAndSave(psd, fileName)
  109. {
  110. // save the image
  111. var pngFile = new File(destinationFolder + "/" + fileName + ".png");
  112. var pngSaveOptions = new PNGSaveOptions();
  113. psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);
  114. }

(4)导出角色表情/服装差分立绘的PNG系列(表情差分为图层组,不用合层的版本)

  1. //从PSD角色文件导出成角色立绘的PNG系列图
  2. //Photoshop CS 5.1下测试可用,不确定是否兼容旧版
  3. //by VariableD
  4. //改造加工自由,转载随意
  5. //使用方法为:
  6. //(1)打开要导出的PSD文件,之后点击文件->脚本->浏览
  7. //(2)选择要导出到的文件夹
  8. //(3)会按照“PSD文件名_服装名_表情名”的格式,导出成PNG
  9. //PSD文件的格式:
  10. //(1)至少要有一个不属于任何图层组的图层,作为固定显示的素体
  11. //(2)至少要有两个图层组,其中一个包含所有的服装差分,另外一个包含所有的表情差分
  12. //(3)所有不属于任何图层组的图层,将会当做固定的部件(例如眼镜)
  13. //(4)除了服装、表情(从下往上数的第一、二个图层组)以外,其他的图层组会被无视,不参与导出
  14. //(5)如果没有服装差分的话,服装的图层组里可以放张透明的图层……
  15. //定义全局变数
  16. var destinationFolder; //目标文件夹
  17. var sourcePsd; //原PSD
  18. var duppedPsd; //复制出的新PSD
  19. //判断是否存在文件和导出目录
  20. main();
  21. // main entry point
  22. function main()
  23. {
  24. // got a valid document?
  25. if( app.documents.length <= 0 )
  26. {
  27. if(app.playbackDisplayDialogs != DialogModes.NO)
  28. {
  29. alert("至少需要打开一个文件哦!");
  30. }
  31. // quit, returning 'cancel' makes the actions palette not record our script
  32. return 'cancel';
  33. }
  34. // ask for where the exported files should go
  35. destinationFolder = Folder.selectDialog("请选择导出目录:");
  36. if(!destinationFolder)
  37. {
  38. return;
  39. }
  40. // cache useful variables
  41. sourcePsdName = app.activeDocument.name; //取得当前文件名
  42. var layerCount = app.documents[sourcePsdName].layers.length; //取得图层总数
  43. var layerSetsCount = app.documents[sourcePsdName].layerSets.length; //取得图层组总数
  44. //alert("共有"+layerCount+"个图层,"+layerSetsCount+"个图层组");
  45. //判断文件内容是否符合导出需求
  46. if((layerCount == 0)&&(layerSetsCount <= 1))
  47. {
  48. if(app.playbackDisplayDialogs != DialogModes.NO)
  49. {
  50. alert("至少要有1个固定图层和2个图层组(服装、表情)的说。");
  51. // quit, returning 'cancel' makes the actions palette not record our script
  52. return 'cancel';
  53. }
  54. }
  55. // 复制这个PSD,这样我们就可以不动原文件,随便搞它了
  56. duppedPsd = app.activeDocument.duplicate();
  57. duppedPsd.activeLayer = duppedPsd.layers[duppedPsd.layers.length-1]; //将底层作为activelayer
  58. //先隐藏所有的图层和图层组
  59. hideAllArtLayers(duppedPsd);
  60. //将没有在组内的图层都显示出来(素体、头发等)
  61. showAllArtLayers(duppedPsd);
  62. //循环输出图层组的排列组合
  63. //服装(从下往上数,第一个图层组)
  64. var clothGroup = duppedPsd.layerSets[duppedPsd.layerSets.length-1];
  65. alert(clothGroup.name);
  66. //表情(从下往上数,第二个图层组)
  67. var emoGroup = duppedPsd.layerSets[duppedPsd.layerSets.length-2];
  68. alert(emoGroup.name);
  69. for (var i=0; i<clothGroup.artLayers.length;i++)
  70. {
  71. //显示衣服
  72. clothGroup.artLayers[i].visible=true;
  73. //导出表情
  74. for (var j=0 ; j<emoGroup.layerSets.length;j++)
  75. {
  76. //显示一个表情组以及组里的全部图层
  77. emoGroup.layerSets[j].visible=true;
  78. showAllArtLayers(emoGroup.layerSets[j]);
  79. //var filename=sourcePsdName.replace(/\.[^\.]+$/, '')+"_"+clothGroup.artLayers[i].name+"_"+emoGroup.layerSets[j].name;
  80. var filename=""+clothGroup.artLayers[i].name+emoGroup.layerSets[j].name;
  81. exportAndSave(duppedPsd,filename);
  82. //隐藏这个表情组
  83. emoGroup.layerSets[j].visible=false;
  84. }
  85. //隐藏衣服
  86. clothGroup.artLayers[i].visible=false;
  87. }
  88. //处理完毕后,关闭复制的PSD
  89. duppedPsd.close(SaveOptions.DONOTSAVECHANGES);
  90. }
  91. //隐藏所有图层、图层组
  92. function hideAllArtLayers(obj)
  93. {
  94. for(var i = 0; i < obj.artLayers.length; i++)
  95. {
  96. obj.artLayers[i].allLocked = false;
  97. obj.artLayers[i].visible = false;
  98. }
  99. for( var i = 0; i < obj.layerSets.length; i++)
  100. {
  101. hideAllArtLayers(obj.layerSets[i]);
  102. }
  103. }
  104. //显示所有图层
  105. function showAllArtLayers(obj)
  106. {
  107. for(var i = 0; i < obj.artLayers.length; i++)
  108. {
  109. obj.artLayers[i].visible = true;
  110. }
  111. }
  112. //显示图层组里的图片
  113. function exportAndSave(psd, fileName)
  114. {
  115. // save the image
  116. var pngFile = new File(destinationFolder + "/" + fileName + ".png");
  117. var pngSaveOptions = new PNGSaveOptions();
  118. psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);
  119. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注