THE NVL Maker

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

[工具插件] 从PSD图层批量导出成PNG的情况

[复制链接]

13

主题

381

帖子

0

精华

管理员

Rank: 9Rank: 9Rank: 9

积分
402
发表于 2019-6-11 17:21:58 | 显示全部楼层 |阅读模式
  1. //将单个图层保存到PNG
  2. //by VariableD

  3. //使用方法为:
  4. //(1)打开要导出的PSD文件,之后点击文件->脚本->浏览
  5. //(2)选择要导出到的文件夹
  6. //(3)会按照“PSD文件名_图层组_子图层组_编号”的格式,导出成PNG

  7. //PSD格式范例(1):
  8. //图层1
  9. //图层2

  10. //PSD格式范例(2):
  11. //图层组1
  12.     //图层1
  13.     //图层2
  14. //图层组2   
  15.     //图层1
  16.     //图层2
  17.    
  18. //PSD格式范例(3):
  19. //图层组1
  20.     //-子组1
  21.         //图层1
  22.         //图层2
  23.     //-子组2
  24.         //图层1
  25.         //图层2
  26. //图层组2
  27.     //-子组1
  28.         //图层1

  29. //定义全局变数
  30. var destinationFolder; //目标文件夹
  31. var trim=true;//自动裁切(设为false则不裁切)

  32. var sourcePsd; //原PSD
  33. var duppedPsd; //复制出的新PSD

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

  35. main();

  36. // main entry point
  37. function main()
  38. {
  39.     //pixel
  40.     app.preferences.rulerUnits = Units.PIXELS;
  41.         // got a valid document?
  42.         if( app.documents.length <= 0 )
  43.         {
  44.                 if(app.playbackDisplayDialogs != DialogModes.NO)
  45.                 {
  46.                         alert("至少需要打开一个文件哦!");
  47.                 }
  48.                 // quit, returning 'cancel' makes the actions palette not record our script
  49.             return 'cancel';
  50.     }

  51.         // ask for where the exported files should go
  52.         destinationFolder = Folder.selectDialog("请选择导出目录:");
  53.         if(!destinationFolder)
  54.         {
  55.                 return;
  56.         }

  57.         // cache useful variables
  58.         sourcePsdName = app.activeDocument.name; //取得当前文件名
  59.         var layerCount = app.documents[sourcePsdName].layers.length; //取得图层总数
  60.         var layerSetsCount = app.documents[sourcePsdName].layerSets.length; //取得图层组总数
  61.        
  62.         //alert("共有"+layerCount+"个图层,"+layerSetsCount+"个图层组");
  63.        
  64.         //判断文件内容是否符合导出需求
  65.         if(layerCount  <2 &&  layerSetsCount<1)
  66.         {
  67.                 if(app.playbackDisplayDialogs != DialogModes.NO)
  68.                 {
  69.                         alert("至少要有2个图层的说。");
  70.                         // quit, returning 'cancel' makes the actions palette not record our script
  71.                         return 'cancel';
  72.                 }
  73.         }
  74.        
  75.         // 复制这个PSD,这样我们就可以不动原文件,随便搞它了
  76.         duppedPsd = app.activeDocument.duplicate();
  77.         //duppedPsd.activeLayer = duppedPsd.layers[duppedPsd.layers.length-1]; //将底层作为activelayer
  78.        
  79.         //先隐藏所有的图层和图层组
  80.         //hideAllArtLayers(duppedPsd);
  81.    
  82.     //散在图层的情况
  83.     if (layerCount>0 && layerSetsCount<1) SaveGroupLayer(duppedPsd,"nogroup");
  84.    
  85.     //图层组保存的情况
  86.     for (var i=0;i<duppedPsd.layerSets.length;i++)
  87.     {
  88.             var layerSet = duppedPsd.layerSets[i];

  89.            //alert("图层组:"+layerSet.name+"子图层组数量:"+layerSet.layerSets.length);

  90.             if (layerSet.layerSets.length>0)
  91.             {
  92.                     //子图层组保存
  93.                     for (var j=0;j<layerSet.layerSets.length;j++)
  94.                     {
  95.                             var subLayerSet = layerSet.layerSets[j];
  96.                             //alert("子图层组:"+subLayerSet.name);
  97.                             //图层保存
  98.                             SaveGroupLayer(subLayerSet,layerSet.name+"_"+subLayerSet.name);
  99.                     }
  100.             }
  101.             else
  102.             {
  103.                     //保存图层
  104.                     SaveGroupLayer(layerSet,layerSet.name);
  105.             }
  106.     }
  107.        
  108.         //处理完毕后,关闭复制的PSD
  109.         duppedPsd.close(SaveOptions.DONOTSAVECHANGES);

  110. }

  111. function SaveGroupLayer(obj,layersetname)
  112. {
  113.         //循环输出图层的排列组合
  114.     for (var k=0;k<obj.artLayers.length;k++)
  115.     {
  116.             var layer =  obj.artLayers[k];

  117.             var width = duppedPsd.width;
  118.             var height = duppedPsd.height;
  119.             
  120.             var newDoc = app.documents.add(width, height, 72, layer.name, NewDocumentMode.RGB, DocumentFill.TRANSPARENT);
  121.             app.activeDocument = duppedPsd;
  122.             //将图层拷贝到newDoc
  123.             layer.duplicate(newDoc,ElementPlacement.INSIDE);
  124.             app.activeDocument = newDoc;
  125.             newDoc.activeLayer = newDoc.artLayers[0];
  126.             newDoc.activeLayer.visible=true;
  127.              //进行裁切
  128.             if (trim) newDoc.crop(newDoc.activeLayer.bounds);
  129.             //保存文件
  130.             exportAndSave(newDoc,sourcePsdName.replace(/\.[^\.]+$/, '')+"_"+layersetname+"_"+(k+1));
  131.             newDoc.close(SaveOptions.DONOTSAVECHANGES);
  132.      }
  133. }

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

  135. function hideAllArtLayers(obj)
  136. {
  137.         for(var i = 0; i < obj.artLayers.length; i++)
  138.         {
  139.                 obj.artLayers[i].allLocked = false;
  140.                 obj.artLayers[i].visible = false;
  141.         }

  142.         for( var i = 0; i < obj.layerSets.length; i++)
  143.         {
  144.                 hideAllArtLayers(obj.layerSets[i]);
  145.         }
  146. }

  147. //显示所有图层
  148. function showAllArtLayers(obj)
  149. {
  150.         for(var i = 0; i < obj.artLayers.length; i++)
  151.         {
  152.                 obj.artLayers[i].visible = true;
  153.         }
  154. }

  155. //导出并保存图片
  156. function exportAndSave(psd, fileName)
  157. {
  158.     // save the image
  159.         var pngFile = new File(destinationFolder + "/" + fileName + ".png");
  160.         var pngSaveOptions = new PNGSaveOptions();
  161.         psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);       
  162. }
复制代码

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|nvlmaker

GMT+8, 2019-6-20 17:12 , Processed in 0.026260 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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