THE NVL Maker

 找回密码
 成为开发者
搜索
查看: 120|回复: 0

[工具插件] 立绘导出(服装眼睛嘴眉毛的差分分别图层组->立绘PNG)

[复制链接]

15

主题

666

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
687
发表于 2021-10-20 14:22:15 | 显示全部楼层 |阅读模式
  1. //从PSD角色文件导出成角色立绘的PNG系列图
  2. //by VariableD

  3. //使用方法为:
  4. //(1)打开要导出的PSD文件,之后点击文件->脚本->浏览
  5. //(2)选择要导出到的文件夹
  6. //(3)会按照“服装名_嘴名_眼名_眉毛名_其他分组名”的格式,导出成PNG

  7. //PSD文件的格式:
  8. //(1)至少要有两个图层组,其中一个包含所有的服装差分,另外一个包含所有的表情差分部件,并进一步细分为四个图层组【嘴/眼/眉/其他】
  9. //(2)所有不属于任何图层组的【图层】,将会当做固定的部件(例如眼镜)
  10. //(3)除了服装、表情(从下往上数的第一、二个图层组)以外,其他的【图层组】会被隐藏,不参与导出
  11. //(4)如果没有差分的话,规定的图层组里可以放张透明的图层

  12. //定义全局变数
  13. var destinationFolder; //目标文件夹

  14. var sourcePsd; //原PSD
  15. var duppedPsd; //复制出的新PSD

  16. //判断是否存在文件和导出目录

  17. main();

  18. // main entry point
  19. function main()
  20. {
  21.         // got a valid document?
  22.         if( app.documents.length <= 0 )
  23.         {
  24.                 if(app.playbackDisplayDialogs != DialogModes.NO)
  25.                 {
  26.                         alert("至少需要打开一个文件哦!");
  27.                 }
  28.                 // quit, returning 'cancel' makes the actions palette not record our script
  29.             return 'cancel';
  30.     }

  31.         // ask for where the exported files should go
  32.         destinationFolder = Folder.selectDialog("请选择导出目录:");
  33.         if(!destinationFolder)
  34.         {
  35.                 return;
  36.         }


  37.         // cache useful variables
  38.         sourcePsdName = app.activeDocument.name; //取得当前文件名
  39.         var layerCount = app.documents[sourcePsdName].layers.length; //取得图层总数
  40.         var layerSetsCount = app.documents[sourcePsdName].layerSets.length; //取得图层组总数
  41.        
  42.         alert("共有"+layerCount+"个图层,"+layerSetsCount+"个图层组");
  43.        
  44.         //判断文件内容是否符合导出需求
  45.         if((layerCount == 0)&&(layerSetsCount <= 1))
  46.         {
  47.                 if(app.playbackDisplayDialogs != DialogModes.NO)
  48.                 {
  49.                         alert("至少要有1个固定图层(素体)和2个图层组(服装、表情)的说。");
  50.                         // quit, returning 'cancel' makes the actions palette not record our script
  51.                         return 'cancel';
  52.                 }
  53.         }
  54.        
  55.         // 复制这个PSD,这样我们就可以不动原文件,随便搞它了
  56.         duppedPsd = app.activeDocument.duplicate();
  57.         duppedPsd.activeLayer = duppedPsd.layers[duppedPsd.layers.length-1]; //将底层作为activelayer
  58.        
  59.         //先隐藏所有的图层和图层组
  60.         hideAllArtLayers(duppedPsd);
  61.        
  62.         //将没有在组内的图层都显示出来(素体、头发等)
  63.         showAllArtLayers(duppedPsd);
  64.        
  65.         //循环输出图层组的排列组合
  66.        
  67.         var layerSetCount=duppedPsd.layerSets.length;

  68.         //服装(从下往上数,第1个图层组)
  69.         var clothGroup = duppedPsd.layerSets[layerSetCount-1];
  70.         //表情(从下往上数,第2个图层组)
  71.         var emoGroup = duppedPsd.layerSets[layerSetCount-2];
  72.        
  73.         //表情组的子分组
  74.         var eyebrowGroup=emoGroup.layerSets[0];
  75.         var eyeGroup=emoGroup.layerSets[1];
  76.         var monthGroup=emoGroup.layerSets[2];
  77.         var specialGroup=emoGroup.layerSets[3];
  78.        
  79.         hideAllArtLayers(eyebrowGroup);
  80.         hideAllArtLayers(eyeGroup);
  81.         hideAllArtLayers(monthGroup);
  82.         hideAllArtLayers(specialGroup);
  83.        
  84.         for (var i=0; i<clothGroup.artLayers.length;i++)
  85.         {
  86.                 //显示衣服
  87.                 clothGroup.artLayers[i].visible=true;
  88.                
  89.                 //导出表情
  90.                 for (var j=0 ; j< monthGroup.artLayers.length;j++)
  91.                 {
  92.                         monthGroup.artLayers[j].visible=true;
  93.                        
  94.                         for (var k=0;k<eyeGroup.artLayers.length;k++)
  95.                         {
  96.                                 eyeGroup.artLayers[k].visible=true;
  97.                                
  98.                                 for (var l=0;l<eyebrowGroup.artLayers.length;l++)
  99.                                 {
  100.                                         eyebrowGroup.artLayers[l].visible=true;
  101.                                        
  102.                                         for (var m=0;m<specialGroup.artLayers.length;m++)
  103.                                         {
  104.                                                 specialGroup.artLayers[m].visible=true;
  105.                                                 var filename=clothGroup.artLayers[i].name+"_"+monthGroup.artLayers[j].name+"_"+eyeGroup.artLayers[k].name+"_"+eyebrowGroup.artLayers[l].name+"_"+specialGroup.artLayers[m].name;
  106.                                                 exportAndSave(duppedPsd,filename);
  107.                                                 specialGroup.artLayers[m].visible=false;
  108.                                         }
  109.                                        
  110.                                         eyebrowGroup.artLayers[l].visible=false;
  111.                                 }
  112.                                 eyeGroup.artLayers[k].visible=false;
  113.                         }
  114.                         monthGroup.artLayers[j].visible=false;
  115.                 }
  116.                
  117.                 //隐藏衣服
  118.                 clothGroup.artLayers[i].visible=false;
  119.                
  120.         }
  121.        
  122.         //处理完毕后,关闭复制的PSD
  123.         duppedPsd.close(SaveOptions.DONOTSAVECHANGES);

  124. }

  125. //隐藏所有图层、图层组

  126. function hideAllArtLayers(obj)
  127. {
  128.         for(var i = 0; i < obj.artLayers.length; i++)
  129.         {
  130.                 obj.artLayers[i].allLocked = false;
  131.                 obj.artLayers[i].visible = false;
  132.         }

  133.         for( var i = 0; i < obj.layerSets.length; i++)
  134.         {
  135.                 hideAllArtLayers(obj.layerSets[i]);
  136.         }
  137. }

  138. //显示所有图层
  139. function showAllArtLayers(obj)
  140. {
  141.         for(var i = 0; i < obj.artLayers.length; i++)
  142.         {
  143.                 obj.artLayers[i].visible = true;
  144.         }
  145. }



  146. //导出并保存图片
  147. function exportAndSave(psd, fileName)
  148. {
  149.     // save the image
  150.         var pngFile = new File(destinationFolder + "/" + fileName + ".png");
  151.         var pngSaveOptions = new PNGSaveOptions();
  152.         psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);       
  153. }

  154.        
  155.        

复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 成为开发者

本版积分规则

Archiver|手机版|nvlmaker

GMT+8, 2021-11-27 16:18 , Processed in 0.016881 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表