接着解析图层的adjustmentData部分信息:

第一个signature是固定的8BIM
第二个是标示下面的data内容所属类型的key
第三个是内容长度。
1var ba:ByteArray = new ByteArray(); 2var signature:String = adjustmentData.readUTFBytes(4); //always 8BIM 3if("" == signature) 4{ 5 throw new Error("解析文件错误了"); 6 return; 7} 8var key:String = adjustmentData.readUTFBytes(4);
key值有很多种,这里只用了标示文本内容的TySh跟图层类型的lsct来举例。


1switch(key) 2{ 3case "TySh": //文本内容 4{ len = adjustmentData.readUnsignedInt(); 5 6adjustmentData.readBytes(ba, 0, len); 7 var version:int = ba.readShort(); 8 ba.position += 48;//跳过 9 var ver1:int = ba.readShort(); 10 var ver2:int = ba.readInt(); 11 //descriptor 12 len = ba.readInt()*2; //the string of unicode values, two bytes per character 13 ba.position += len; 14 len = ba.readInt(); 15 if(0 == len) 16 { 17 ba.position += 4; 18 } 19 20var numOfItems:int = ba.readInt(); 21 var descripterKey:String; 22 var typeTxt:String; 23 for (var i:int = 0; i < numOfItems; i++) 24 { 25 descripterKey = ba.readUTFBytes(4); 26 if("" == descripterKey) 27 { 28 descripterKey = ba.readUTFBytes(4); 29 } 30 typeTxt = ba.readUTFBytes(4); 31 switch(descripterKey) 32 { 33 case 'Txt ': 34 textContent = parseUnicodeString(ba); 35 labelSheetVo = PsdUtil.psdVo.labelSheetDict[layerName]; 36 isText = true; 37 break; 38 } 39 } 40 break; 41 } 42 case "lsct": //文件夹判断 43 { 44 len = adjustmentData.readUnsignedInt(); 45 adjustmentData.readBytes(ba, 0, len); 46 //0 = any other type of layer, 1 = open “folder”, 2 = closed “folder”, 3 = bounding section divider, hidden in the UI 47 var type:int = ba.readUnsignedInt(); 48 _isFolder = (1 == type || 2 == type); 49 break; 50 } 51 52 //这几个在长度上有特殊的去读要求 53 case "lrFX": //Effects Layer info 54 case "lfx2": //Object Based Effects Layer info 55 case "Patt": //Patterns ase "Anno": //Annotations 56 { 57 len = adjustmentData.readUnsignedInt(); 58 mode = len%4; 59 if(0 != mode) 60 { 61 adjustmentData.readBytes(ba, 0, len + 4 - mode); 62 } 63 else 64 { 65 adjustmentData.readBytes(ba, 0, len); 66 } 67 break; 68 } 69 default: 70 { 71 len = adjustmentData.readUnsignedInt(); 72 adjustmentData.readBytes(ba, 0, len); 73 break; 74 } 75}