完美實(shí)現(xiàn)GIF動(dòng)畫縮略圖的php代碼
為了讓問題更加清晰,我們先還原動(dòng)畫各幀:
選擇一:用PHP中的Imagick模塊:
<?php
$image = new Imagick('old.gif');
$i = 0;
foreach ($image as $frame) {
$frame->writeImage('old_' . $i++ . '.gif');
}
?>
選擇二:用ImageMagick提供的convert命令:
shell> convert old.gif old_%d.gif
結(jié)果得到GIF動(dòng)畫各幀示意圖如下所示:
可以明顯的看到,GIF動(dòng)畫為了壓縮,會(huì)以第一幀為模板,其余各幀按照適當(dāng)?shù)钠屏恳来卫奂?,并只保留不同的像素,結(jié)果是導(dǎo)致各幀尺寸不盡相同,為縮略圖造成障礙。
下面看看如何用PHP中的Imagick模塊來完美實(shí)現(xiàn)GIF動(dòng)畫縮略圖:
<?php
$image = new Imagick('old.gif');
$image = $image->coalesceImages();
foreach ($image as $frame) {
$frame->thumbnailImage(50, 50);
}
$image = $image->optimizeImageLayers();
$image->writeImages('new.gif', true);
?>
代碼里最關(guān)鍵的是coalesceimages方法,它確保各幀尺寸一致,用手冊(cè)里的話來說就是:
Composites a set of images while respecting any page offsets and disposal methods. GIF, MIFF, and MNG animation sequences typically start with an image background and each subsequent image varies in size and offset. Returns a new Imagick object where each image in the sequence is the same size as the first and composited with the next image in the sequence.
同時(shí)要注意optimizeImageLayers方法,它刪除重復(fù)像素內(nèi)容,用手冊(cè)里的話來說就是:
Compares each image the GIF disposed forms of the previous image in the sequence. From this it attempts to select the smallest cropped image to replace each frame, while preserving the results of the animation.
BTW:如果要求更完美一點(diǎn),可以使用quantizeImages方法進(jìn)一步壓縮。
注意:不管是coalesceimages,還是optimizeImageLayers,都是返回新的Imagick對(duì)象!
如果你更習(xí)慣操作shell的話,那么可以這樣實(shí)現(xiàn)GIF動(dòng)畫縮略圖:
shell> convert old.gif -coalesce -thumbnail 50x50 -layers optimize new.gif
生成的new.gif如下:
有個(gè)細(xì)節(jié)問題:convert版本會(huì)比php版本小一些,這是API實(shí)現(xiàn)不一致所致。
另外,如果縮略圖尺寸不符合原圖比例,為了避免變形,還要考慮裁剪或者是補(bǔ)白,由于本文主要討論GIF動(dòng)畫縮略圖的特殊性,就不再繼續(xù)討論這些問題了,有興趣的自己搞定吧。
- Thinkphp調(diào)用Image類生成縮略圖的方法
- thinkphp3.2.2實(shí)現(xiàn)生成多張縮略圖的方法
- php實(shí)現(xiàn)上傳圖片生成縮略圖示例
- PHP中使用FFMPEG獲取視頻縮略圖和視頻總時(shí)長實(shí)例
- 超級(jí)好用的一個(gè)php上傳圖片類(隨機(jī)名,縮略圖,加水印)
- PHP實(shí)現(xiàn)生成透明背景的PNG縮略圖函數(shù)分享
- php實(shí)現(xiàn)根據(jù)url自動(dòng)生成縮略圖的方法
- 使用gd庫實(shí)現(xiàn)php服務(wù)端圖片裁剪和生成縮略圖功能分享
- php實(shí)現(xiàn)的支持imagemagick及gd庫兩種處理的縮略圖生成類
- 使用ThinkPHP生成縮略圖及顯示
相關(guān)文章
php下獲取http狀態(tài)的實(shí)現(xiàn)代碼
在項(xiàng)目開發(fā)中,有時(shí)我們需要知道遠(yuǎn)程的URL地址是否能訪問正常,判斷其正常與否后進(jìn)行下一步的操作,那么在PHP中如何獲取遠(yuǎn)程HTTP的狀態(tài)呢2014-05-05
Yii PHP Framework實(shí)用入門教程(詳細(xì)介紹)
本篇文章是對(duì)Yii PHP Framework實(shí)用入門教程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
linux平臺(tái)編譯安裝PHP7并安裝Redis擴(kuò)展與Swoole擴(kuò)展實(shí)例教程
這篇文章主要介紹了linux平臺(tái)編譯安裝PHP7并安裝Redis擴(kuò)展與Swoole擴(kuò)展的方法,結(jié)合實(shí)例形式詳細(xì)分析了Linux平臺(tái)上安裝php7并安裝Redis擴(kuò)展與Swoole擴(kuò)展的具體步驟與操作技巧,需要的朋友可以參考下2016-09-09
php中郵箱地址正則表達(dá)式實(shí)現(xiàn)與詳解
本文章不但要講述了關(guān)于正則達(dá)式而且還講述了關(guān)于郵箱正則的構(gòu)成用法詳解,有需要了解的朋友可以參考一下,同時(shí)我們也提供了多種不同的郵箱驗(yàn)證實(shí)例2012-04-04
php實(shí)現(xiàn)excel中rank函數(shù)功能的方法
這篇文章主要介紹了php實(shí)現(xiàn)excel中rank函數(shù)功能的方法,較為詳細(xì)的分析了rank函數(shù)的功能及具體實(shí)現(xiàn)方法,需要的朋友可以參考下2015-01-01
php實(shí)現(xiàn)session自定義會(huì)話處理器的方法
這篇文章主要介紹了php實(shí)現(xiàn)session自定義會(huì)話處理器的方法,可通過設(shè)置session.save_handler為user來調(diào)用自定義的回調(diào)函數(shù),從而實(shí)現(xiàn)session自定義會(huì)話處理器的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-01-01
PHP實(shí)現(xiàn)異步定時(shí)多任務(wù)消息推送
在 PHP 中實(shí)現(xiàn)異步定時(shí)多任務(wù)消息推送的方式有多種,其中一種常用的方式是使用異步任務(wù)隊(duì)列,這篇文章主要介紹了這一方法的具體實(shí)現(xiàn),需要的可以參考一下2023-04-04




