I'm trying to resize animated GIF, it appends frames after each other see result image:
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?