由于libpsd0.9库中没有对Photoshop6.0以上版本文字图层的读取支持,所以只能自己写了。找了很多资料,比如在adobe论坛找到的Photoshop File Formats.pdf。Photoshop6.0以上版本文字图层的格式为type tool object。如要读取它,必须用库中的psd_system.c文件,其中的psd_stream_get_int(context)为读取4个字节等等。
如上图:TySh代表type tool object。表示文字图层从这里开始。
00005670h: 00 00 00 06表示这个文字图层有6个标示(Number of items in descriptor)即有这个文字图层有6个关键字。 分别是: 第一个:"Txt " 格式"TEXT".内容:guojun。 00005670h:00 00 00 00 即“Txt ”前的4个字节都是0,表示后面的关键字为4个字节的关键字,
即是“Txt ”。注意最后有一个空格。 00005680h:00 00 00 07表示内容有7个字符,包括最后的00字符。 4个字节的关键字可以用psd_stream_get_int(context)取得。 第二个:"textGridding" 格式“enum” 变量textGridding,内容 None。 0000569h0:00 00 00 0C表示后面关键字即"textGridding"为13个字节的长度。 如果是这样,那么在程序中需要psd_stream_get(context, keychar, length); keychar[length] = 0;这样取得关键字,然后进行对比strcmp(keychar, "textGridding") == 0。
程序大致为这样// Number of items in descriptor number_items = psd_stream_get_int(context);
while(number_items --) { length = psd_stream_get_int(context); if(length == 0) rootkey = psd_stream_get_int(context); else { rootkey = 0; psd_stream_get(context, keychar, length); keychar[length] = 0; } // Type: OSType key type = psd_stream_get_int(context); //coutConsole1("gj"); switch(rootkey) { case 0: if(strcmp(keychar, "textGridding") == 0) { psd_assert(type == 'enum'); // TypeID: 4 bytes (length), followed either by string or (if length is zero) 4- // byte typeID textgrid_length = psd_stream_get_int(context); if (textgrid_length!=0) { psd_stream_get(context, keychar, textgrid_length); keychar[textgrid_length] = 0; if(strcmp(keychar, "textGridding") == 0) { int l=psd_stream_get_int(context); if (l==0) { switch(psd_stream_get_int(context)) { case 'None': data->testgridding="n"; break; default: break; } } //coutConsole1("none"); } } } else { if ((strcmp(keychar, "TextIndex") == 0)) { psd_assert(type == 'long'); coutConsole1("TextIndex"); } } break;
case 'Txt ': // String psd_assert(type == 'TEXT'); // String value as Unicode string text_length = psd_stream_get_int(context); for(i = 0; i < text_length; i ++) data->textstring[i] = psd_stream_get_short(context) & 0x00FF; break; case 'Ornt': psd_assert(type == 'enum'); // TypeID: 4 bytes (length), followed either by string or (if length is zero) 4- // byte typeID length = psd_stream_get_int(context); psd_assert(length == 0); key = psd_stream_get_int(context); // ornt style psd_assert(key == 'Ornt'); data->oristyle=psd_stream_get_type_tool_object_orientation_style(context); break; case 'AntA': psd_assert(type=='enum'); // TypeID: 4 bytes (length), followed either by string or (if length is zero) 4- // byte typeID length = psd_stream_get_int(context); psd_assert(length == 0); key = psd_stream_get_int(context); // anti style psd_assert(key == 'Annt'); data->antistyle =psd_stream_get_type_tool_object_antialiasing_style(context); break; // case 'warp': // psd_assert(type=='Objc'); // //coutConsole1("warp"); // break; // default: psd_assert(0); psd_stream_get_object_null(type, context); break; } }