2013-09-01 94 views
1

我發送imagick一個圖像,當它是一個動畫gif它將刪除動畫並留在一個單一的靜物。這是因爲調整大小代碼?或者它是圖像庫中固有的東西?下面是我的代碼,這裏有什麼問題?Imagick製作動畫GIF動畫?

  if (isset($_FILES["image"])) { 
       $allowed_ext = array("jpg", "jpeg", "png", "gif"); 
       $file_name = $_FILES["image"]["name"]; 
       $file_ext = strtolower(end(explode(".", $file_name))); 
       $file_size = $_FILES["image"]["size"]; 
       $file_tmp = $_FILES["image"]["tmp_name"]; 

       // verify extension 
       if (in_array($file_ext, $allowed_ext) && $file_size < 2097152) { 
        // check if image needs scaling 
        $img = new imagick($file_tmp); 
        $img_size = $img->getImageGeometry(); 

        $partyCommentErrors .= "<li>Width: ".$img_size["width"]." | Height: ".$img_size["height"]."</li>"; 

        if ($img_size["width"] > 600 || $img_size["height"] > 600) { 
         // resize image 
         $img->resizeImage(600, 600, imagick::FILTER_LANCZOS, 0.9, true); 
        } 

        $img_size = $img->getImageGeometry(); 
        $img->writeImage("imgs/commentpics/".$id.".".$file_ext); 

        // update database 
        $qry = "UPDATE comments SET thereisimg=1, imgtype='".$file_ext."', imgwidth='".$img_size["width"]."', imgheight='".$img_size["height"]."' WHERE id=$id"; 
        mysqli_query($dblink, $qry); 

       } else { 
        $partyCommentErrors .= "<li>File type must be jpg, jpeg, png, or gif</li><li>File size must be less than 2 megabytes.</li>"; 
       } 
      } 
+0

只是一個小問題丟回:爲什麼你認爲代碼必須建立在首位GIF動畫? – hakre

+0

這不是創建一個圖像。它從表單獲取圖像並獲取其尺寸,然後根據需要調整尺寸並保存。對不起可能應該已經說清楚了。 – user2720360

+0

那麼,爲什麼你認爲它必須保存爲一個動畫GIF呢? – hakre

回答

2

因爲GIF動畫不存儲爲完整圖像,而是存儲爲動畫的幀之間的差異,你需要調用Imagick::coalesceImages能夠修改包含GIF中的圖像。

修改它們之後,您需要調用Imagick::deconstructImages來生成幀之間的新差異集,以便能夠將它們保存爲動畫Gif。

<?php 
$imagick = new Imagick("original.gif"); 

$format = $imagick->getImageFormat(); 
if ($format == 'GIF') { 
    $imagick = $imagick->coalesceImages(); 
    do { 
    $imagick->resizeImage(120, 120, Imagick::FILTER_BOX, 1); 
    } while ($imagick->nextImage()); 
    $imagick = $imagick->deconstructImages(); 
    $imagick->writeImages('new_120x120.gif', true); 

    // can be added some more gifs 
    $imagick = $imagick->coalesceImages(); 
    do { 
    $imagick->resizeImage(100, 100, Imagick::FILTER_BOX, 1); 
    } while ($imagick->nextImage()); 
    $imagick = $imagick->deconstructImages(); 
    $imagick->writeImages('new_100x100.gif', true); 
} 

$imagick->clear(); 
$imagick->destroy(); 

,或者更簡單:

<?php 
$image = new Imagick($file_src); 

$image = $image->coalesceImages(); 

foreach ($image as $frame) { 
    $frame->cropImage($crop_w, $crop_h, $crop_x, $crop_y); 
    $frame->thumbnailImage($size_w, $size_h); 
    $frame->setImagePage($size_w, $size_h, 0, 0); 
} 

$image = $image->deconstructImages(); 
$image->writeImages($file_dst, true); 
?>