PSD解析工具实现(五)

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

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

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

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

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

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里面的坐标位置。 string

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

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

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

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

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; //图层的终点位置 = 当前位置 + 扩展长度
		}
相关文章
相关标签/搜索