前段时间遇到了处理gif动图的需求,主要就是截取GIF的第一帧来作为封面图,PHP自带的扩展并没有什么好的解决方法,不过可以通过扩展Imagick来解决。
以下教程适用于Windows
安装
安装 Imagick
PHP5.5~7.1,传送门:https://windows.php.net/downloads/pecl/releases/imagick/3.4.3/
PHP7.2,传送门:https://windows.php.net/downloads/pecl/snaps/imagick/3.4.3/
- 选择合适自己的版本(nts/ts、x86/x64、php version),下载解压后,将扩展文件
php_imagick.dll
复制到PHP的扩展目录,通常在PHP运行目录下的./ext/
目录。 - 修改
php.ini
,添加该扩展extension=php_imagick.dll
,注意,如果是PHP7以上的版本,写法可能是extension=imagick
,如果你不确定的话,可以看看配置文件中别的扩展是怎么写的 - 复制压缩文件内的其它
.dll
文件到php根目录,重启web环境 - 访问
phpinfo()
,在配置中出现了Imagick
,说明扩展生效。
安装 ImageMagick
ImageMagick是一个开源的命令行工具,Imagick通过ImageMagick来处理图像。
下载传送门: https://windows.php.net/downloads/pecl/deps/
- 还是选择合适自己的版本,注意上面截图上的
Imagick compiled with ImageMagick version
,在文件列表中选择合适的版本。 - 将ImageMagick目录添加到系统环境变量(属性->高级系统设置->环境变量->系统变量->path)中
- 将
./ImageMagick/bin
目录中所有的.dll
文件复制php根目录,重启web环境。 - 访问
phpinfo()
,如图显示了支持的文件类型,说明安装生效。
应用
<?php
$imgPath = './upload/test.gif';
//载入图像
$Imagick = new Imagick($imgPath);
//枚举每一帧图片
foreach ($Imagick as $frame){
//保存第一帧为png格式的缩略图
$frame->writeImage('./upload/test.png?imageView2/2/w/1280');
break;
}
//销毁资源
$Imagick->clear();
$Imagick->destroy();