文档章节

PSD解析工具实现(五)

小姚
 小姚
发布于 2016/03/30 15:46
字数 502
阅读 149
收藏 2

接下来就是对每一个图层进行解析:

这里讲到前两个字节读出来如果小于0,那么绝对值就是图层的个数。

layerCount = Math.abs(layerData.readShort());

下面是每个图层所包含的内容信息表格:

这样,就可以根据每个图层的字节长度循环去处理每一个图层:

layerVect = new Vector.<LayerVo>();
var layerVo:LayerVo;
for (var i:int = 0; i < layerCount; i++) 
{
   layerVo = new LayerVo();		
   layerVo.parse(layerData);
   layerVect.push(layerVo);
}

图层的前4个值(top,Left,Bottom,Right)分别是左上角跟右下角在psd里面的坐标位置。

Channel是图层的通道数,Channel length info是通道信息,并且每种通道占6位字节长度。

从上面表格可以看出,通道类型分别是RGB跟Alpha以及他们分别长度。

Extra data size:是扩展信息的长度,这里面保存了图层名字以及一些额外的信息(例如文本内容,图层类型(图层组或是图层)等)。

Layer name的描述说图层名字长度是4的倍数,如果读出来的不是就要补齐,如果刚好是4的倍数,直接加上4。

Adjustment layer info里面就是保存了上面所说的额外信息。

private const ChANNEL_TYPE:Object = {"0":"Red","1":"Green", "2":"Blue", "-1":"Transparency mask", "-2":"User supplied layer mask"};
		public function parse(ba:ByteArray):void
		{
			top = ba.readUnsignedInt(); //左上角
			left = ba.readUnsignedInt();
			bottom = ba.readUnsignedInt(); //右下角
			right = ba.readUnsignedInt();
			width = right - left;
			height = bottom - top;
			
			var pos0:int;
			channels = ba.readShort();
			for (var i:int = 0; i < channels; i++) 
			{
				var channelId:int = ba.readShort();
				var channelLen:int = ba.readUnsignedInt();
				channelDataArr.push({"channelId":channelId, "channelType":ChANNEL_TYPE[channelId+""], "channelLen":channelLen});
			}
			blendModeSignature = ba.readUTFBytes(4);
			blendModeKey = ba.readUTFBytes(4);
			opacity = ba.readUnsignedByte();
			clipping = ba.readUnsignedByte();
			flags = ba.readUnsignedByte();
			fillter = ba.readUnsignedByte();
			extraLen = ba.readUnsignedInt();
			pos0 = ba.position; //当前位置
			var layerMaskLen:int = ba.readInt();
			if(0 != layerMaskLen)
			{
				layerMaskVo = new LayerMaskVo();
				layerMaskVo.parse(ba);
			}
			var layerBlendingRanges:int = ba.readInt();
			if(0 != layerBlendingRanges)
			{
				layerBlendingRangesVo = new LayerBlendingRangesVo();
				layerBlendingRangesVo.parse(ba, layerBlendingRanges);
			}
			var pos:int = ba.position;
			//pascal string只有255长度
			var sizeOfName : uint = ba.readUnsignedByte();
			layerName = ba.readMultiByte(sizeOfName, "gb-2312");
			if(0 == sizeOfName%4)
			{
				sizeOfName += 4;
			}
			else
			{
				//填充到4的倍数
				while(sizeOfName%4 != 0 )
				{
					sizeOfName++;
				}	
			}
			ba.position = pos + sizeOfName; 
			while(ba.position < pos0 + extraLen)
			{
				analyzeAdjuetmentData(ba);
			}
			ba.position = pos0 + extraLen; //图层的终点位置 = 当前位置 + 扩展长度
		}







© 著作权归作者所有

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

包括做游戏,我们做程序的很多时候都是需要跟psd打交道,那么如何对psd这个东西进行程序化操作就成为了我们提高工作效率的手段。 相信有研究过psd脚本的人都知道,psd的脚本是用js写的,大体...

小姚
2016/03/23
487
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的PSD解析库--pypsd

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

小编辑
2012/04/18
767
0
用jmagick能实现psd文件的解析或者图层替换么?

用java和jmagick如何实现psd文件的解析?

shirley8798
2014/04/28
339
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
6
0
Android 贝塞尔曲线实践——波浪式运动

一、波浪效果如下 贝塞尔曲线自定义波浪效果的案例很多,同样方法也很简单,大多数和本案例一样使用二次贝塞尔曲线实现,同样还有一种是PathMeasure的方式,这里我们后续补充,先来看贝塞尔曲...

IamOkay
今天
3
0
Nmap之防火墙/IDS逃逸

选项 解释 -f 报文分段 --mtu 指定偏移大小 -D IP欺骗 -sI 原地址欺骗 --source-port 源端口欺骗 --data-length 指定发包长度 --randomize-hosts 目标主机随机排序 --spoof-mac Mac地址欺骗 ...

Frost729
今天
2
0
带你搭一个SpringBoot+SpringData JPA的环境

不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的。 其实我在学完SpringBoot和SpringData JPA了之...

java菜分享
今天
7
0
Chocolatey 在Window搭建一个开发环境

在看了(利用 Chocolatey 快速在 Windows 下搭建一个开发环境)后,准备从零开始 一、准备工作 1、用管理员权限启动:powershell,执行错误请参考(PowerShell因为在此系统中禁止执行脚本的解...

近在咫尺远在天涯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部