PSD解析工具实现(六)

本文详细解析了Photoshop PSD文件中图层结构的adjustmentData部分,包括签名、标识类型、长度等关键信息的读取过程,并以文本内容和文件夹判断为例展示了具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

第一个signature是固定的8BIM

第二个是标示下面的data内容所属类型的key

第三个是内容长度。

var ba:ByteArray = new ByteArray();
var signature:String = adjustmentData.readUTFBytes(4); //always 8BIM
if("" == signature)
{
  throw new Error("解析文件错误了");
  return;
}
var key:String = adjustmentData.readUTFBytes(4);

key值有很多种,这里只用了标示文本内容的TySh跟图层类型的lsct来举例。

switch(key)
{
case "TySh": //文本内容
{  len = adjustmentData.readUnsignedInt();
adjustmentData.readBytes(ba, 0, len);
	var version:int = ba.readShort();
	ba.position += 48;//跳过
	var ver1:int = ba.readShort();
	var ver2:int = ba.readInt();
	//descriptor
	len = ba.readInt()*2; //the string of unicode values, two bytes per character
	ba.position += len;
	len = ba.readInt();
	if(0 == len)
	{
		ba.position += 4;
	} 
var numOfItems:int = ba.readInt();
	var descripterKey:String;
	var typeTxt:String;
	for (var i:int = 0; i < numOfItems; i++) 
	{ 
		descripterKey = ba.readUTFBytes(4);
		if("" == descripterKey)
		{
			descripterKey = ba.readUTFBytes(4);
		}
		typeTxt = ba.readUTFBytes(4);
		switch(descripterKey) 
		{
			case 'Txt ':
			   textContent = parseUnicodeString(ba);
                           labelSheetVo = PsdUtil.psdVo.labelSheetDict[layerName];
                           isText = true;
                           break;
		}
	}
	break;
	}
	case "lsct": //文件夹判断
	{
		len = adjustmentData.readUnsignedInt();
		adjustmentData.readBytes(ba, 0, len);
		//0 = any other type of layer, 1 = open “folder”, 2 = closed “folder”, 3 = bounding section divider, hidden in the UI
		var type:int = ba.readUnsignedInt();
		_isFolder = (1 == type || 2 == type);	
		break;
	}
        //这几个在长度上有特殊的去读要求			
	case "lrFX": //Effects Layer info
	case "lfx2": //Object Based Effects Layer info 
	case "Patt": //Patterns ase "Anno": //Annotations
	{
		len = adjustmentData.readUnsignedInt();
		mode = len%4;
		if(0 != mode)
		{
			adjustmentData.readBytes(ba, 0, len + 4 - mode);
		}
		else
		{
			adjustmentData.readBytes(ba, 0, len);
		}
		break;
	}
	default:
	{
		len = adjustmentData.readUnsignedInt();
		adjustmentData.readBytes(ba, 0, len);
		break;
	}
}




转载于:https://my.oschina.net/u/185335/blog/651426

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值