完美實現GIF動畫縮圖(GIF壓縮使用C++、shell命令、php)

來源:互聯網
上載者:User

 

縮圖是個很常用的功能。它的實現並不複雜,但如果原圖是GIF動畫的話,問題就會變得繁瑣一點。因為GIF(動畫)由多個圖片組成,需要先解壓單獨圖片->圖片壓縮->圖片組合動畫。

 

 

使用C++,需要安裝

 

Blob blob((void*)data, len);<br />list<Image> imageList;<br />list<Image> coalescedList;<br />list<Image> resizeList;<br />readImages(&imageList, blob);<br />coalesceImages(&coalescedList, imageList.begin(), imageList.end());<br />list<Image>::iterator it = imageList.begin();<br />it = coalescedList.begin();<br />while(it != coalescedList.end()){<br />Image image = (*it);<br />image.zoom("100x100");<br />resizeList.push_back(image);<br />++it;<br />}<br />writeImages(resizeList.begin(), resizeList.end(), "smaller.gif"); 

 

用ImageMagick提供的convert命令:

  shell> convert old.gif old_%d.gif
  結果得到GIF動畫各幀如下所示:


  可以明顯的看到,GIF動畫為了壓縮,會以第一幀為模板,其餘各幀按照適當的位移量依次累加,並只保留不同的像素,結果是導致各幀尺寸不盡相同,為縮圖造成障礙。下面看看如何用PHP中的Imagick模組來完美實現GIF動畫縮圖:

  shell> convert old.gif -coalesce -thumbnail 50x50 -layers optimize new.gif

  產生的new.gif如下:

  

 

 

用PHP中的Imagick模組:

<?php<br />$image = new Imagick('old.gif');<br />$image = $image->coalesceImages();<br />foreach ($image as $frame) {<br /> $frame->thumbnailImage(50, 50);<br />}<br />$image = $image->optimizeImageLayers();<br />$image->writeImages('new.gif', true);<br />?> 

 

代碼裡最關鍵的是coalesceimages方法,它確保各幀尺寸一致,用手冊裡的話來說就是:

  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.

  同時要注意optimizeImageLayers方法,它重複資料刪除像素內容,用手冊裡的話來說就是:

  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:如果要求更完美一點,可以使用quantizeImages方法進一步壓縮。

  注意:不管是coalesceimages,還是optimizeImageLayers,都是返回新的Imagick對象!如果你更習慣操作shell的話,那麼可以這樣實現GIF動畫縮圖:

 

有個細節問題:convert版本會比php版本小一些,這是API實現不一致所致。另外,如果縮圖尺寸不符合原圖比例,為了避免變形,還要考慮裁剪或者是補白。

 

 

 

/*************************************************/

 

參考:

http://kb.cnblogs.com/page/87154/

http://www.wizards-toolkit.org/discourse-server/viewtopic.php?f=2&t=15172

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.