loops/gif

GIF 和尤其是动画 GIF 的打包/解包工具。

1.0.2-RC 2016-04-07 17:23 UTC

This package is not auto-updated.

Last update: 2024-09-20 19:04:43 UTC


README

用于解析/编译 GIF 文件的库。

要求

  • 至少 PHP 5.3。
  • Loops\Autoloader 包。
  • Loops\Exception 包。
  • Loops\Config 包。

如何使用它

自动加载

如果您没有 composer,请调用 bootstrap

:::php
  require $path_to_package.'/bootstrap.inc.php';

此库使用基于包的自动加载,具有用于包命名空间的目录(PSR-4),并且类名使用下划线作为目录分隔符(PSR-0)。

GIF 打包

GIF 打包代表 GIF 协议块和子块的单一部分。打包名称来自 GIF89a 规范,因此如果您想有效地使用此库,请务必熟悉这些规范。

目前,此库可以管理以下类型的 GIF 块

  • 头部
  • 逻辑屏幕描述符
  • 全局颜色表
  • 图像描述符
  • 局部颜色表
  • 基于表的图像数据
  • 图形控制扩展
  • 注释扩展
  • 纯文本扩展
  • 应用扩展
  • 未知扩展
  • 尾部
  • NETSCAPE 2.0 应用扩展(特定应用扩展)

每个打包可以解析或编译成一个流资源。每个打包可能包含数据,数据名称也来自 GIF89a 规范

:::php
  // parse a Graphic Control Extension 
  $pack = new \Loops\Gif\Pack_GraphicControlExtension();
  // unpack from stream
  $pack->unpack( $stream );
  
  // then we can fetch data
  $pack->getData( 'Reserved' );
  $pack->getData( 'Disposal Method' );
  $pack->getData( 'User Input Flag' );
  $pack->getData( 'Transparent Color Flag' );
  $pack->getData( 'Delay Time' );
  $pack->getData( 'Transparent Color Index' );
  
  // compile a Image Descriptor
  $pack = new \Loops\Gif\Pack_ImageDescriptor();
  // assign all required data
  $pack->setData( 'Image Left Position' , 40 );
  $pack->setData( 'Image Top Position' , 20 );
  $pack->setData( 'Image Width' , 400 );
  $pack->setData( 'Image Height' , 200 );
  $pack->setData( 'Local Color Table Flag' , 0b1 );
  $pack->setData( 'Interlace Flag' , 0b0 );
  $pack->setData( 'Sort Flag' , 0b1 );
  $pack->setData( 'Reserved' , 0b01 );
  $pack->setData( 'Size of Local Color Table' , 0b101 );
  
  // then pack it to stream
  $pack->pack( $stream );

为了方便起见,要编译打包,必须设置所有数据。

解包器

使用 \Loops\Gif\Unpacker 类解析 GIF 文件/流/二进制文件,并返回 GIF 打包的数组。

:::php
  $packs = \Loops\Gif\Unpacker::unpack( $file_or_stream_or_binary );

如果您只需要检测是否存在某个块,可以使用 \Loops\Gif\Unpacker 实例。此实例将按需处理打包。

:::php
  $unpacker = \Loops\Gif\Unpacker::instance( $file_or_stream_or_binary );
  // is there at least two Image Descriptor (ie. animated GIF)
  $unpacker->hasPack( 'Image Descriptor' , 1 ); // first occurence is 0
  // GIF packs after this one have not been parsed yet
  
  // process only 5 packs
  $i = 5;
  while( $i-- )
  {
    // unpack current pack and go to next one
    $unpacker->next();
  }

如果 GIF 数据损坏,解包过程可能会抛出 \Loops\Gif\Exception

打包器

使用 \Loops\Gif\Packer 类编译 GIF 打包的数组,并返回 GIF 的二进制数据。

:::php
  $binary = \Loops\Gif\Packer::pack( $array_of_packs );

您还可以使用 \Loops\Gif\Packer 实例部分编译打包数组。

:::php
  $packer = \Loops\Gif\Packer::instance( $array_of_packs );

  // process only 5 packs
  $i = 5;
  while( $i-- )
  {
    // pack current pack and go to next one
    $packer->next();
  }

如果打包顺序不正确,打包过程可能会抛出异常。

因此,为了成功编译打包数组,必须遵守一些重要的 GIF 规范约束

  • 头部必须是数组中的第一个打包,不能在其他地方
  • 逻辑屏幕描述符必须是数组中的第二个打包,不能在其他地方
  • 全局颜色表必须是数组中的第三个打包,不能在其他地方,但只有当逻辑屏幕描述符声明存在全局颜色表时(全局颜色表标志)
  • 局部颜色表只能在图像描述符之后出现,但只有当图像描述符声明存在局部颜色表时(局部颜色表标志)
  • 基于表的图像数据只能在局部颜色表之后出现,或者当图像描述符声明不存在局部颜色表时(局部颜色表标志)的图像描述符之后出现

贡献者

想要贡献吗?

只有一个规则要遵循: 挑战自我