文档章节

PSD解析工具实现(一)

小姚
 小姚
发布于 2016/03/23 00:39
字数 699
阅读 909
收藏 2

包括做游戏,我们做程序的很多时候都是需要跟psd打交道,那么如何对psd这个东西进行程序化操作就成为了我们提高工作效率的手段。

相信有研究过psd脚本的人都知道,psd的脚本是用js写的,大体上懂js的人很快就可以通过它的文档写出一些工具来,但是问题就是photoshop执行脚本的效率实在是不忍直视,慢到令人发指,所以,这次是通过二进制的形式来对psd进行解析获取里面的图片以及文本,并且把psd里面对应的图片保存到一个文件夹里面。有了这些,基本上我们就可以构建自己的工具了,

因为二进制解析psd文件解析文档里面对文本样式的解析藏得很深,除了ps5跟5.0版本之外,我在文档里面找不到获取的办法,所以还是得借助ps脚本来获取psd里面文本的样式,顺便也是了解一下怎么使用photoshop的脚本:

1.新建一个psd文件test.psd,并创建一个样式文本:

2.文件-->脚本 --> 浏览,选择先前写好的导出文本样式的脚本文件test.jsx,psd的文件后缀是jsx

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里面。

输出结果:

<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

© 著作权归作者所有

共有 人打赏支持
小姚
粉丝 29
博文 135
码字总数 41380
作品 0
广州
程序员
私信 提问
PSD解析工具实现(二)

要想通过文件流的形式来解析psd文件,首先要了解psd的文件格式, adobe的开发者文档里面有着很详细的说明: http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ 首先,总体来说是...

小姚
2016/03/23
220
0
PSD.rb

PSD.rb 是一个使用Ruby编写的通用的PhotoShop文档解析器,该工具允许你以一种易管理的树结构方式来处理Photoshop文档,从而找出文档中的重要数据,如: 文档结构 文件大小 图层/目录大小和配...

tsl0922
2013/09/07
653
0
Python 爬虫工具列表

本文转载自伯乐在线:http://python.jobbole.com/82633/ 这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib)。 requests -网络库。 grab - 网络库(基于pycurl)...

好铁
2016/03/16
1K
1
Python的PSD解析库--pypsd

pypsd 是 Python 实现的 PSD 文件解析库,目前还没有完全完成,但已经可用。

小编辑
2012/04/18
767
0
python-60:Python 爬虫的工具列表

本文转载自伯乐在线:http://python.jobbole.com/82633/ 这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib)。 requests -网络库。 grab - 网络库(基于pycurl)...

达岭凹老大
2015/12/15
454
2

没有更多内容

加载失败,请刷新页面

加载更多

equals()的重写规则

自反性。对于任何非null的引用值x,x.equals(x)应返回true。 对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。 传递性。对于任何非null的引用...

无精疯
9分钟前
0
0
Go基础系列:双层channel用法示例

双层通道的解释见Go的双层通道 以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。 信号通道不用来传递数据,...

echojson
17分钟前
0
0
PHP文件上传error的错误类型

PHP文件上传error的错误类型 - $_FILES['file']['error'] 有以下几种类型 1、UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。 2、UPLOAD_ERR_INI_SIZE 其值为 1,上传的文件超过了 ph......

小良下山化了个缘
44分钟前
2
0
分布式项目(四)Mapping Server 数据映射

上回说道CoAp client和server的实现,数据也安装定义的格式发送到了kafka中,接下来就是Mapping server的实现,物理设备数据映射到抽象设备上,并赋予数据业务含义。 iot-mapping 构建iot-m...

lelinked
53分钟前
2
0
使用data pump驱动的外部表移动数据

使用data pump驱动的外部表移动数据 比如我们有一个报表的数据,准备从一个数据库A中移动到另一个数据库B中,如何实现? 这个问题,我们使用带data pump驱动的外部表方式,很容易实现,具体方法如下...

突突突酱
56分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部