php代码,完美实现GIF动画缩略图。

下面是一个从CS GIF动画的热点游戏来说明问题:
GIF动画图片:old.gif

为了使问题更清楚,我们首先恢复动画帧:

选择一:在PHP中使用imagick模块:
复制代码代码如下所示:
< PHP
图像=新imagick美元(老。gif);
$ I = 0;
foreach(美元美元图像帧){
框架- > writeimage美元('old_。$;
}
>

选择二:由ImageMagick转换命令:
复制代码代码如下所示:
壳>将old.gif old_ % d.gif



因此,GIF动画的以下帧如下所示:
动画框架示意图

可以清楚地看到,为了压缩GIF动画,第一帧将被用作模板,其余帧应该根据适当的偏移量累积,并且只保留不同的像素。结果是每个帧的大小不一样,造成缩略图的障碍。

下面看看如何完美的imagick PHP模块的GIF动画缩略图:
复制代码代码如下所示:
< PHP
图像=新imagick美元(老。gif);
图像=图像->美元美元coalesceimages();
foreach(美元美元图像帧){
美元thumbnailimage框架>>(50, 50);
}
图像=图像->美元美元optimizeimagelayers();
图像-> writeimages美元(新.gif,真的);
>



在代码中最重要的是coalesceimages方法,使帧的尺寸都是一样的,这是在手册。


复合一组图像,同时尊重任何页面偏移和处理方法。GIF,恼羞成怒,MNG的动画序列通常开始与图像背景和每个后续的图像变化的大小和偏移。返回一个新的imagick对象序列中的每个图像的大小为第一与序列中的下一个图像复合一样。

同时,注重optimizeimagelayers方法,去除重复的像素内容,这是在手册。


比较每个图像的前一个图像的GIF处理形式,它也被称为以下两个方面:第一个是第二个。

顺便说一句:如果你想更完美,你可以使用quantizeimages方法进一步压缩。

注意:无论是coalesceimages或optimizeimagelayers,一切回到新imagick对象!

如果您更习惯于操作shell,那么您可以实现GIF动画缩略图。
复制代码代码如下所示:
壳>将old.gif -合并-缩略图50X50层优化new.gif



生成的new.gif如下:


new.gif

有一个细节问题:转换版本比PHP版本小一点,这是由于API实现不一致造成的。

另外,如果缩略图尺寸不符合原来的比例,为了避免变形,还要考虑剪切或填充,因为本文主要讨论GIF动画的缩略图的特殊性,将不再继续讨论这些问题,对它们的修复感兴趣。