解析GIF应用程序的扩展块 - 如何查找块大小?

时间:2014-01-16 01:32:18

标签: php delphi parsing decode gif

我正在解析GIF 89a(是的,我需要)文件而且我被困在Application Extension块上。

它们有13个字节的标题(包括开头的21个FF 0B字节)然后有一些数据。有多少数据?我怎么知道读书多了?

如果您知道答案,可以跳过以下部分,并告诉我:)

page说:

  

ApplicationData包含软件应用程序使用的信息。该字段由一系列子块构成,这些子块与纯文本扩展块中的数据相同。“

     

每个子块以一个字节开头,该字节指示后面的数据字节数。此字节后面可以包含1到255个数据字节。该字段中可以有任意数量的子块。

这样我可以解析NETSCAPE 2.0块:

  

03 01 00 00 00

所以我在PHP中有一个循环:

for (;;)
{
  $size = ord(fread($handle, 1));
  if ($size == 0) break;
  fseek($handle, $size);
}
如果您愿意,可以在Delphi中使用

或相同的内容:

while F.Position < F.Size do begin
    F.Read(Size, 1);            // F is TFileStream
    if Size = 0 then break;
    F.Position := F.Position + Size;
  end;

迭代:

  

size =读取1个字节; // size = 3;

     

读取3个字节;

     

size =读取1个字节;

     

size = 0所以打破

到目前为止,非常好,问题出现了:XMP数据

所以这个块中的字节就像这样(下面的ASCII):

  

21 FF 0B 58 4D 50 20 44 61 74 61 58 4D 50

     

!`.XMP DataXMP

然后转到ASCII XML转储:

<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> 

大约500字节。

我显然无法以与读取NETSCAPE 2.0块相同的方式阅读它。 它似乎以00字节终止。 它应该一直读到00字节吗?然后,如果在NETSCAPE 2.0块上失败!

GIF解码器应该如何在Application Extension块上运行?它们中有多少数据?

Problematic XMP Data image

1 个答案:

答案 0 :(得分:1)

好的 - NETSCAPE 2.0块方法可能没问题,因为我的文件可能被错误地读取了。