PSD解析工具实现(六)

接着解析图层的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}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )