包括作游戏,咱们作程序的不少时候都是须要跟psd打交道,那么如何对psd这个东西进行程序化操做就成为了咱们提升工做效率的手段。 javascript
相信有研究过psd脚本的人都知道,psd的脚本是用js写的,大致上懂js的人很快就能够经过它的文档写出一些工具来,可是问题就是photoshop执行脚本的效率实在是不忍直视,慢到使人发指,因此,此次是经过二进制的形式来对psd进行解析获取里面的图片以及文本,而且把psd里面对应的图片保存到一个文件夹里面。有了这些,基本上咱们就能够构建本身的工具了, java
由于二进制解析psd文件解析文档里面对文本样式的解析藏得很深,除了ps5跟5.0版本以外,我在文档里面找不到获取的办法,因此仍是得借助ps脚原本获取psd里面文本的样式,顺便也是了解一下怎么使用photoshop的脚本: app
1.新建一个psd文件test.psd,并建立一个样式文本: 工具
2.文件-->脚本 --> 浏览,选择先前写好的导出文本样式的脚本文件test.jsx,psd的文件后缀是jsx spa
function docCheck() { if (!documents.length) { alert('There are no documents open.'); return; } } docCheck(); //检测当前psd app.displayDialogs = DialogModes.NO; var docRef = activeDocument; var docWidth = docRef.width.value; var docHeight = docRef.height.value; var mySourceFilePath = activeDocument.fullName.path + "/"; //文档信息 var str = "<psd filename=\"" + docRef.name + "\" path=\"" + mySourceFilePath + "\" width=\"" + docWidth + "\" height=\"" + docHeight + "\">\n"; var endTimestamp; var startTimestamp; traverseLayers = function(doc, fun) { var win = new Window("dialog{text:'操做窗口',bounds:[100,100,400,220],\ btnOne:Button{bounds:[80,20,280,70] , text:'Export' },\ prog:Progressbar{bounds:[20,90,280,101] , value:0,maxvalue:100},\ };"); win.btnOne.onClick = function(){ win.prog.value = 50;//(index++/layers.length)*100; startTimestamp=(new Date()).valueOf(); var layers = doc.layers; var index = 0; for (var i = layers.length - 1; i >= 0; i--) { var layer = layers[i]; _traverse(layer, fun); } win.prog.value = 100; endTimestamp=(new Date()).valueOf(); alert("共处理"+count+"个文件,耗时:"+(endTimestamp - startTimestamp)/1000+"sec"); }; win.center(); win.show(); }; var count = 0; function _traverse(layer, fun) { count++; if (layer.typename == "LayerSet") { var layers = layer.layers; for (var i = layers.length - 1; i >= 0; i--) { _traverse(layers[i], fun); } } else { fun(layer); } }; traverseLayers(app.activeDocument, exportBounds); function exportBounds(layer) { var lk=layer.kind; if(lk=="LayerKind.TEXT") { try { var bold; try { bold = layer.textItem.fauxBold; } catch(e) { bold = false; } var leading; try { leading = Number(layer.textItem.leading).toFixed(2); } catch(e) { leading = 0; } var underline; try { underline = (layer.textItem.underline != UnderlineType.UNDERLINEOFF); } catch(e) { underline = false; } var str2 = "\t<layer name=\"" + layer.name + "\" contents=\"" + layer.textItem.contents + "\" color=\"" + layer.textItem.color.rgb.hexValue + "\" font=\"" + layer.textItem.font + "\" size=\"" + layer.textItem.size + "\" fauxBold=\"" + bold + "\" leading=\"" + leading + "\" underline=\"" + underline + "\" />\n"; str += str2.toString(); } catch(e) { alert(layer.name); } } }; var csvFile = new File(mySourceFilePath.toString().match(/([^\.]+)/)[1] + app.activeDocument.name.match(/([^\.]+)/)[1] + ".xml"); csvFile.open('w'); csvFile.writeln(str + "</psd>"); csvFile.close();
上面的代码主要工做就是针对当前的psd文档,经过递归每一个图层,若是是文本的话,就把文本对象的属性输出到一个xml里面。 code
输出结果: xml
<psd filename="test.psd" path="~/Desktop/test/" width="16" height="12">
<layer name="你们好" contents="你们好" color="FB0808" font="MicrosoftYaHei" size="24" fauxBold="true" leading="0" underline="false" />
</psd> 对象
完成!!! 递归
psd脚本的手册: photoshop-cc-javascript-ref.pdf 游戏