完美實(shí)現(xiàn)GIF動(dòng)畫(huà)縮略圖的php代碼
為了讓問(wèn)題更加清晰,我們先還原動(dòng)畫(huà)各幀:
選擇一:用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)畫(huà)各幀示意圖如下所示:
可以明顯的看到,GIF動(dòng)畫(huà)為了壓縮,會(huì)以第一幀為模板,其余各幀按照適當(dāng)?shù)钠屏恳来卫奂?,并只保留不同的像素,結(jié)果是導(dǎo)致各幀尺寸不盡相同,為縮略圖造成障礙。
下面看看如何用PHP中的Imagick模塊來(lái)完美實(shí)現(xiàn)GIF動(dòng)畫(huà)縮略圖:
<?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è)里的話來(lái)說(shuō)就是:
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è)里的話來(lái)說(shuō)就是:
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)畫(huà)縮略圖:
shell> convert old.gif -coalesce -thumbnail 50x50 -layers optimize new.gif
生成的new.gif如下:
有個(gè)細(xì)節(jié)問(wèn)題:convert版本會(huì)比php版本小一些,這是API實(shí)現(xiàn)不一致所致。
另外,如果縮略圖尺寸不符合原圖比例,為了避免變形,還要考慮裁剪或者是補(bǔ)白,由于本文主要討論GIF動(dòng)畫(huà)縮略圖的特殊性,就不再繼續(xù)討論這些問(wèn)題了,有興趣的自己搞定吧。
- Thinkphp調(diào)用Image類生成縮略圖的方法
- thinkphp3.2.2實(shí)現(xiàn)生成多張縮略圖的方法
- php實(shí)現(xiàn)上傳圖片生成縮略圖示例
- PHP中使用FFMPEG獲取視頻縮略圖和視頻總時(shí)長(zhǎng)實(shí)例
- 超級(jí)好用的一個(gè)php上傳圖片類(隨機(jī)名,縮略圖,加水印)
- PHP實(shí)現(xiàn)生成透明背景的PNG縮略圖函數(shù)分享
- php實(shí)現(xiàn)根據(jù)url自動(dòng)生成縮略圖的方法
- 使用gd庫(kù)實(shí)現(xiàn)php服務(wù)端圖片裁剪和生成縮略圖功能分享
- php實(shí)現(xiàn)的支持imagemagick及gd庫(kù)兩種處理的縮略圖生成類
- 使用ThinkPHP生成縮略圖及顯示
相關(guān)文章
PHP實(shí)現(xiàn)隨機(jī)發(fā)放撲克牌
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)隨機(jī)發(fā)放撲克牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04PHP中CakePHP添加數(shù)據(jù)庫(kù)實(shí)例方法
在本篇文章里小編給大家整理的一篇關(guān)于PHP中CakePHP添加數(shù)據(jù)庫(kù)實(shí)例方法,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。2021-01-01PHP商品秒殺問(wèn)題解決方案實(shí)例詳解【mysql與redis】
這篇文章主要介紹了PHP商品秒殺問(wèn)題解決方案,結(jié)合實(shí)例形式詳細(xì)分析了php結(jié)合mysql與redis實(shí)現(xiàn)商品秒殺功能的相關(guān)操作技巧及注意事項(xiàng),需要的朋友可以參考下2019-07-07PHP使用Pthread實(shí)現(xiàn)的多線程操作實(shí)例
這篇文章主要介紹了PHP使用Pthread實(shí)現(xiàn)的多線程操作的方法,以完整實(shí)例形式分析了php多線程的創(chuàng)建及使用相關(guān)技巧,需要的朋友可以參考下2015-11-11PHP使用三種方法實(shí)現(xiàn)數(shù)據(jù)采集
這篇文章主要介紹了PHP使用三種方法實(shí)現(xiàn)數(shù)據(jù)采集,對(duì)數(shù)據(jù)采集感興趣的同學(xué),可以參考下2021-04-04PHP的命令行擴(kuò)展Readline相關(guān)函數(shù)的使用
PHP 作為一個(gè) Web 開(kāi)發(fā)語(yǔ)言,相對(duì)來(lái)說(shuō),命令行程序并不是它的主戰(zhàn)場(chǎng)。所以很多年輕的 PHP 開(kāi)發(fā)者可能連命令行腳本都沒(méi)有寫(xiě)過(guò),更別提交互式的命令操作了。而今天,我們帶來(lái)的這個(gè)擴(kuò)展就是針對(duì) PHP 的交互式命令行操作的2021-05-05