2009-04-05 43 views

Trả lời

58

nếu bạn có quyền truy cập ImageMagick, bạn có thể làm điều này:

system("convert big.gif -coalesce coalesce.gif"); 
system("convert -size 200x100 coalesce.gif -resize 200x10 small.gif"); 

này có khả năng nhất có thể với các plugin ImageMagick nếu bạn không có quyền truy cập hệ thống()

LƯU Ý: điều này có thể tạo một kích thước lớn hơn mặc dù hình ảnh kích thước nhỏ hơn do coalescing về cơ bản sẽ tối ưu hóa hình ảnh.

UPDATE: Nếu bạn không có quyền truy cập ImageMagick, bạn sẽ có thể sử dụng một sự kết hợp của các bước sau để thay đổi kích thước một gif động (giả sử bạn có quyền truy cập GD):

  1. Detect nếu hình ảnh là một gif động: Can I detect animated gifs using php and gd? (đầu câu trả lời)
  2. Chia gif động vào khung cá nhân: http://www.phpclasses.org/package/3234-PHP-Split-GIF-animations-into-multiple-images.html
  3. Thay đổi kích thước khung hình cá nhân: http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
  4. Recomposite khung thành gif động một lần nữa: http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

này chắc chắn là nhiều hơn nữa thâm hơn so với lộ trình ImageMagick, nhưng nó phải là về mặt kỹ thuật có thể.

Nếu bạn làm cho nó hoạt động, hãy chia sẻ với mọi người!

+0

xin lỗi, tôi không có quyền truy cập vào Imagemagick. Bất kỳ giải pháp nào khác? – riad

+0

Đăng cập nhật với một số bước sử dụng GD và các lớp của bên thứ ba để thực hiện điều này (theo lý thuyết). –

+9

Tôi nghĩ rằng tôi đã nhận được lý thuyết chỉ là về làm việc trong thực tế: http://forssto.com/gifexample/ –

1

chỉ creat 3 thư mục 2.images tên 1.frame_output 3.resized_frame_output và tải về 2 bộ mã hóa và giải mã lớp từ này bên dưới liên kết lớp 1.Download "GIFDecoder.class.php" từ http://phpclasses.elib.com/browse/package/3234.html 2.Download lớp "GIFEncoder .class.php "từ http://phpclasses.betablue.net/browse/package/3163.html

và sau đó chạy tên tập lệnh là" resize_animator.php ", tạo tệp html tải lên & Hãy tận hưởng tập lệnh.

..save kịch bản này như ..... index.php .......

<html> 
<body> 
<table width="500" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"> 
<tr> 
<form action="resize_animator.php" method="post" enctype="multipart/form-data" > 
<td> 
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF"> 
<tr> 
<td align="center"><font face="Tahoma">SELECT ANIMATED FILE</font> 
<input type="file" name="uploadfile" size="20" accept="image/gif"/> 
</td> 
</tr> 
<tr> 
<td align="center"><input type="submit" name="Submit" value="PROCESS ANIMATION" /></td> 
</tr> 
</table> 
</td> 
</form> 
</tr> 
</table> 
</body> 
</html> 

.................. ...... lưu và tập lệnh này dưới dạng resize_animator.php ............

<?php 

    require "GIFDecoder.class.php"; 
    include "GIFEncoder.class.php"; 
    $file_name= $_FILES['uploadfile']['name']; 
    $file_ext = substr($file_name, -4); 
    $file_size=($_FILES["uploadfile"]["size"] /1024); 
    if($file_ext=='.gif') 
    { 
if($file_size > 0 && $file_size < 2000) 
    { 
    session_start (); 
     $uploaded_file = $_FILES['uploadfile']['tmp_name']; 
     $fp=file_get_contents($uploaded_file); 

     if ($fp) 
      { 
       $_SESSION['delays'] = Array (); 
       $gif = new GIFDecoder ($fp); 
       $arr = $gif->GIFGetFrames (); 
       $_SESSION [ 'delays' ] = $gif -> GIFGetDelays (); 

       for ($i = 0; $i < count ($arr); $i++) 
       { 
         fwrite (fopen (($i < 10 ? "frame_output/$i$i_frame.gif" : "frame_output/$i_frame.gif"), "wb"), $arr [ $i ]); 
       } 
      } 

     function resize_frames($newwidth,$newheight) 
      { 
        $dir=opendir("frame_output/"); 
        $i=0; 
        while($imgfile=readdir($dir)) 
        { 
         if ($imgfile != "." && $imgfile!="..") 
          { 
             $imgarray[$i]=$imgfile; 
             $uploadedfile = "frame_output/".$imgarray[$i]; 
             $src = imagecreatefromgif($uploadedfile); 
             list($width,$height)=getimagesize($uploadedfile); 
             $tmp=imagecreatetruecolor($newwidth,$newheight); 
             imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height); 
             $filename = "resized_frame_output/".$imgarray[$i]; 
             imagegif($tmp,$filename,100); 
             imagedestroy($src); 
             imagedestroy($tmp); 
             $i++; 
          } 
        } 
        closedir($dir); 

       if ($dh = opendir ("resized_frame_output/")) 
       { 
        while (false !== ($dat = readdir ($dh))) 
        { 
         if ($dat != "." && $dat != "..") 
         { 
          $frames [ ] = "resized_frame_output/$dat"; 
         } 
        } 
        closedir ($dh); 
       } 

      $gif = new GIFEncoder ($frames,$_SESSION [ 'delays' ],0, 2, 0, 0, 0,"url"); 
      $data = $gif->GetAnimation (); 

      $x='x'; 
      $y='_'; 
      $uploaded_file_name= $_FILES['uploadfile']['name']; 
      $actual_file_name = substr($uploaded_file_name, 0, -4); 
      $file_extention = substr($uploaded_file_name, -4); 
      $new_name=$actual_file_name.$y.$newwidth.$x.$newheight.$file_extention ; 

      //$output_image_name=$newwidth.$x.$newheight; 
      fwrite (fopen ("images/$new_name", "wb"), $data); 
      //remove resized frames from folder 
      //sleep for 1 second 
      // usleep(2000000); 
      $dir = 'resized_frame_output/'; 
      foreach(glob($dir.'*.*') as $v) 
       { 
       unlink($v); 
       } 
     } // end of function resize_frames 


      $gif = new GIFEncoder ($frames,$_SESSION [ 'delays' ],0, 2, 0, 0, 0,"url"); 
      $data = $gif->GetAnimation (); 

      $x='x'; 
      $y='_'; 
      $z='_p'; 
      $uploaded_file_name= $_FILES['uploadfile']['name']; 
      $actual_file_name = substr($uploaded_file_name, 0, -4); 
      $file_extention = substr($uploaded_file_name, -4); 
      $new_name=$actual_file_name.$y.$newwidth.$x.$newheight.$z.$file_extention ; 

      //$output_image_name=$newwidth.$x.$newheight; 
      fwrite (fopen ("images/$new_name", "wb"), $data); 
      //remove resized frames from folder 
      //sleep for 1 second 
      //usleep(2000000); 
      $dir = 'resized_frame_output/'; 
      foreach(glob($dir.'*.*') as $v) 
       { 
       unlink($v); 
       } 
     } // end of function resize_frames 

      resize_frames(110,110); 
      resize_frames(120,160); 
      resize_frames(120,80); 
      resize_frames(128,96); 
      resize_frames(128,128); 
      resize_frames(208,208); 
      resize_frames(208,320); 

      session_destroy(); 

      //usleep(200000); 

      //remove resized frames from folder 
      $dir = 'frame_output/'; 
      foreach(glob($dir.'*.*') as $v) 
       { 
       unlink($v); 
       } 
     echo "<center><h1>Your Animation processing is compleated.</h1></center>"; 
     echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>"; 
    } //end of file size checker 
else 
{ 
     echo "<center><h2>You Upload a unfit size image .Upload a file within 2000 KB</h2></center>"; 
     echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>"; 
} 
    } //end of file extention checker 
    else 
    { 
    echo "<center><h2>Uplaod a gif file!</h2></center>"; 
    echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>"; 
    } 
    ?> 

................. ...... LETS ENJOY ............

bỏ ghi chú chức năng ngủ để xem công việc xảy ra trong các thư mục đó. Không cần thiết nhưng tôi sử dụng nó để xem chức năng.

+0

Điều này không hoạt động với các khung có độ trong suốt trong đó. – FidoBoy

2

Tôi nghĩ rằng tôi đã có điều này trong túi.

Giải pháp này không có nghĩa là hoàn hảo và chứa một số lực lượng vũ phu ở đây và ở đó, nhưng tôi có thể nối thêm kịch bản thay đổi kích thước hình ảnh dựa trên GD/PHP với đủ chức năng hỗ trợ hoạt ảnh.

Giải pháp này chủ yếu dựa trên các thư viện phần mềm miễn phí tuyệt vời của László Zsidi - http://www.phpclasses.org/browse/author/283569.html

Bạn có thể kiểm tra một bản demo nhanh chóng và tải các nguồn từ http://forssto.com/gifexample/ (link trực tiếp: http://forssto.com/gifexample/gifanimresize.zip)

VẤN ĐỀ NỔI TIẾNG:

  • Hỗ trợ minh bạch - điều này sẽ là dễ dàng gắn thêm vào giải pháp này, nhưng vì tôi không có e cần ngay lập tức cho điều này, tôi dừng ở đây.

  • Tốc độ khung hình - vì một số lý do không rõ lớp GifEncoder không tính vào tài khoản tỷ lệ khung hình được chỉ định. Tôi sẽ cần xem xét sau này.

  • Tôi đã tìm thấy một tệp gif từ tập hợp của các thử nghiệm bằng cách nào đó có khác nhau các khung có kích thước trong đó và hoạt ảnh không hoạt động chính xác. Vẫn còn một số lỗi để thực hiện sau đó.

+0

Xin chào. Cảm ơn. Tôi đã thử giải pháp của bạn. Tôi sửa đổi các nguồn để đọc hình ảnh từ một chuỗi (cho tôi biết nếu bạn quan tâm) nhưng nó bật ra được WAAAY để làm chậm. Cuối cùng tôi đã nhận ra rằng Imagick đã có mặt trên máy chủ và đã sử dụng nó. – Rolf

1

Tất cả câu trả lời này ngoại trừ máng ImageMagick không hoạt động đối với tôi. Kịch bản trong câu trả lời trước khi tất cả điều này là đầy đủ các lỗi.

Ngay cả khi cài đặt ImageMagick cũng khó quản lý nên đây là trải nghiệm của tôi.

Đây là how to install ImageMagick trên cửa sổ 7 và xampp 1.7.4.
Lưu ý: Chọn 64 bit (đối với win7) và khi cài đặt, hãy chọn tùy chọn "Thêm vào đường dẫn hệ thống".

Và sau đó làm theo: http://www.creativearmory.com/tutorials/resize-animated-gifs-with-php-and-imagemagick

tôi đã mất hàng giờ trên các kịch bản ở bài viết này, và ImageMagick và hướng dẫn này là sucessfull trong vài phút.

Và một lưu ý nữa: máy chủ web của tôi có ImageMagick theo mặc định, vì vậy tôi đoán hầu hết các máy chủ đều có nó.

3

Ví dụ về http://www.php.net/manual/en/imagick.coalesceimages.php sẽ thay đổi kích thước gif của bạn trong khi vẫn giữ lại thời gian khung của bạn. Một cái gì đó hầu hết các ví dụ khác không làm.

Ví dụ khác xây dựng lại gif trong khi điều này cho phép bạn sửa đổi các khung của hình ảnh.

+0

imagick là tốt nhất tại thao tác hình ảnh phức tạp. PHP không biết một vài thủ thuật. – transilvlad

+0

Đó là giải pháp tôi đã đi cho cuối cùng, tôi đã thử các giải pháp khác, nhưng chúng đã bị cấm chậm. Hãy chắc chắn rằng bạn có Imagick trên lưu trữ của bạn (nó không phải là một điều hiếm hoi ngày nay) và sử dụng đó. – Rolf

1

Nếu bạn không có ImageMagick trong máy chủ của bạn, bạn có thể muốn thử điều này:

http://www.phpclasses.org/package/7353-PHP-Resize-animations-in-files-of-the-GIF-format.html

Các lớp được thay đổi kích thước hình ảnh động GIF với GD.Đầu tiên phân tích các khung hình, sau đó thay đổi kích thước chúng, sau đó nó biên dịch lại thành tệp đơn mà không làm mất thời gian trễ, phương thức xử lý, bảng màu, v.v.

Hãy thử và nếu bạn tìm thấy lỗi hoặc muốn đề xuất một số tối ưu, v.v. bạn có thể sử dụng diễn đàn của lớp hoặc để lại nhận xét trên trang trong trang web của tôi. Và tôi sẽ trả lời ASAP đó.

5

Tôi đã thử nhiều ví dụ về việc thay đổi kích thước GIF động bằng mô-đun Imagick PHP, nhưng không ai trong số chúng làm việc cho tôi. Sau đó, sau một thời gian gỡ lỗi cuối cùng tôi thấy vấn đề thực tế: các hình ảnh động được mất khi lưu hình ảnh vào đĩa, bởi $animation->writeImage($file_dst); hoặc $animation->writeImages($file_dst, true);

Tôi đã thay đổi nó để file_put_contents($file_dst, $animation->getImagesBlob()); và hầu hết các ví dụ bắt đầu làm việc ngay lập tức.

Hy vọng nó sẽ giúp ai đó.

+0

Tuyệt vời !! Điều này đã cứu ngày của tôi! Cảm ơn Anthony.Các phiên bản cũ của Imagick là lỗi khi sử dụng writeImages nhưng sử dụng phương thức của bạn hoạt động tốt và không có vấn đề gì cả! :) – FidoBoy

+0

điều này đã làm các trick khi writeImages() sẽ tước các hình ảnh động. – Jared

11

Hãy thử GDEnhancer (Sử dụng ImageCraft). Nó chỉ cần Thư viện GD và nó giữ hình động gif

+0

Cảm ơn. Nó có thể được sử dụng với PHP 5.2? Trên trang web nó nói 5.4+, đó là khá cắt cạnh cho hầu hết các môi trường (bao gồm cả môi trường mục tiêu của tôi trong trường hợp này). Nếu không thì sẽ rất tuyệt! – Rolf

+0

Than ôi, trang web GDEnhancer đã chết. – TechNyquist

+0

@TechNyquist giờ GDEnhacer không được dùng nữa, hãy sử dụng https://github.com/coldume/imagecraft thay thế – BredeBS

1

GIF Animation Resizer là một công cụ một lớp đơn giản sẽ thực hiện thủ thuật.

Lưu ý: Sử dụng thư mục tạm thời để viết ra các khung riêng biệt. Trong khi nó timestamps các khung hình, bạn có thể cần phải tạo một thư mục duy nhất nếu bạn định sử dụng nó trên một máy chủ mà nhiều người dùng sẽ được thay đổi kích thước GIF cùng một lúc.

3

Nếu bạn có ImageMagick cài đặt sau đó bạn có thể sử dụng một cuộc gọi duy nhất để convert:

system("convert big.gif -coalesce -repage 0x0 -resize 200x100 -layers Optimize small.gif"); 
0

Imagecraft là một thư viện PHP GD đáng tin cậy và mở rộng mà giữ GIF hoạt hình, chỉnh sửa và soạn hình ảnh trong nhiều lớp và hỗ trợ watermark .

0

tôi đã sử dụng chức năng này:

function gifResize($file_origin,$file_dest,$percent){  
    $crop_w = 0; 
    $crop_h = 0; 
    $crop_x = 0; 
    $crop_y = 0; 
    $image = new Imagick($file_origin); 
    $originalWidth = $image->getImageWidth(); 
    $originalHeight = $image->getImageHeight(); 
    $size_w = ($originalWidth*$percent)/100; 
    $size_h = ($originalHeight*$percent)/100; 
    if(($size_w-$originalWidth)>($size_h-$originalHeight)){ 
     $s = $size_h/$originalHeight; 
     $size_w = round($originalWidth*$s); 
     $size_h = round($originalHeight*$s); 
    }else{ 
     $s = $size_w/$originalWidth; 
     $size_w = round($originalWidth*$s); 
     $size_h = round($originalHeight*$s); 
    }  
    $image = $image->coalesceImages(); 

    foreach ($image as $frame) { 
     $frame->cropImage($crop_w, $crop_h, $crop_x, $crop_y); 
     $frame->thumbnailImage($size_h, $size_w); 
     $frame->setImagePage($size_h, $size_w, 0, 0); 
    } 
    $imageContent = $image->getImagesBlob(); 
    $fp = fopen($file_dest,'w'); 
    fwrite($fp,$imageContent); 
    fclose($fp); 

}

Các vấn đề liên quan