0

I'm trying to resize animated GIF, it appends frames after each other see result image:

enter image description here

And Here is my code:

function resize($target, $new_width) {

  list($width, $height) = getimagesize($target);

  $new_height = $height * $new_width / $width;
  $imageType = exif_imagetype($target);

  switch ($imageType) {
    case IMAGETYPE_JPEG: $image = imagecreatefromjpeg($target); $extension = 'jpg'; break;
    case IMAGETYPE_PNG:  $image = imagecreatefrompng($target);  $extension = 'png'; break;
    case IMAGETYPE_GIF:  $image = imagecreatefromgif($target);  $extension = 'gif'; break;
    default: return false;
  }

  $newImage = imagecreatetruecolor($new_width, $new_height);

  if ($imageType == IMAGETYPE_GIF) {
    // preserve GIF animation
    $gif = new \Imagick($target);
    $gif = $gif->coalesceImages();
    foreach ($gif as $frame) {
      $tempImage = imagecreatetruecolor($new_width, $new_height);
      imagecopyresampled($tempImage, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
      $frameData = $frame->getImageBlob();
      $frameImage = new \Imagick();
      $frameImage->readImageBlob($frameData);
      $frameImage->resizeImage($new_width, $new_height, \Imagick::FILTER_LANCZOS, 1);
      $frameImage->setImagePage($new_width, $new_height, 0, 0);
      $gifImages[] = $frameImage;
      imagedestroy($tempImage);
    }
    $gif = $gif->deconstructImages();
    $gif = $gif->appendImages(true);
  } else {
    imagecopyresampled($newImage, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
  }

  switch ($extension) {
    case 'jpg': imagejpeg($newImage, $target); break;
    case 'png': imagepng($newImage,  $target); break;
    case 'gif':
      $gif->writeImages($target, true);
      break;
  }

  imagedestroy($image);
  imagedestroy($newImage);


}

Can anyone help please, what I'm doing wrong?

ferhado
  • 2,363
  • 2
  • 12
  • 35

0 Answers0