接下来就是对每个图层进行解析: 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; //图层的终点位置 = 当前位置 + 扩展长度 }