loops / gif
GIF 和尤其是动画 GIF 的打包/解包工具。
1.0.2-RC
2016-04-07 17:23 UTC
Requires
- php: >=5.4
- loops/autoloader: ~1.0
- loops/config: ~1.0
- loops/exception: ~1.0
Requires (Dev)
- phpunit/phpunit: ~5.0.0
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 规范约束
- 头部必须是数组中的第一个打包,不能在其他地方
- 逻辑屏幕描述符必须是数组中的第二个打包,不能在其他地方
- 全局颜色表必须是数组中的第三个打包,不能在其他地方,但只有当逻辑屏幕描述符声明存在全局颜色表时(全局颜色表标志)
- 局部颜色表只能在图像描述符之后出现,但只有当图像描述符声明存在局部颜色表时(局部颜色表标志)
- 基于表的图像数据只能在局部颜色表之后出现,或者当图像描述符声明不存在局部颜色表时(局部颜色表标志)的图像描述符之后出现
贡献者
- Pierrot Evrard 也就是 Loops — https://twitter.com/lxxps
想要贡献吗?
只有一个规则要遵循: 挑战自我。