PSD解析工具实现(一)

包括作游戏,咱们作程序的不少时候都是须要跟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 游戏

相关文章
相关标签/搜索