2011-03-25 80 views
2

我使用PHP和Imagick使用下面的代碼將採集多個圖像到一個GIF動畫寫一些代碼GIF文件大小:減少使用ImageMagick和PHP

<?php 
    error_reporting(E_ALL); 
    ini_set('display_errors',1); 

    $anim = new Imagick(); 


    for($i = 0; $i<=36; $i++) { 
     $bgImage = new Imagick('Background.gif'); 

     $imagick = new Imagick("sw_layers-$i.gif"); 

     $bgImage->setImageColorspace($imagick->getImageColorspace()); 
     $bgImage->compositeImage($imagick, imagick::DISPOSE_PREVIOUS,0,0); 

     $draw = new ImagickDraw(); 

     /*** set the fill color ***/ 
     $draw->setFillColor(new ImagickPixel("orange")); 

     $draw->annotation(10, 10, 'Hello world'); 

     $bgImage->drawImage($draw); 

     $anim->addImage($bgImage); 
     $anim->setFormat("gif"); 
     $anim->setImageDispose(3); 
     $anim->setImageCompression(imagick::COMPRESSION_JPEG); 
     $anim->setImageCompressionQuality(50); 
    } 

    echo $anim->writeImages('Result.gif', true); 
?> 

的背景圖像和「世界,你好」都應該每幀出現。正如你所看到的,我正在將文本圖像,背景圖像和圖層合併到一個框架中。圖層圖像包含某種具有透明背景的圖形,所以我提供的背景和文本應該出現在這種情況下。但是,問題在於動畫gif「result.gif」的文件大小,對於30幀圖像來說大約爲3 MB。

問題是,如何減少文件大小而不影響質量呢?我願意接受包括在系統上運行命令行工具的答案。

感謝

回答

0

您是否嘗試過這一點,比較幀和跨框架刪除複製數據?

/* optimize the image layers */ 
$im->optimizeImageLayers(); 

/* write the image back */ 
$im->writeImages("test_optimized.gif", true); 

來源:Imagick OptimizeLayers

+0

即使幀的大小已經相同,我也會得到「圖像大小不一致」錯誤。任何想法? – 2017-07-19 04:15:03