Skip to content

Instantly share code, notes, and snippets.

@bennyfactor
Created February 19, 2013 21:23
Show Gist options
  • Save bennyfactor/4990066 to your computer and use it in GitHub Desktop.
Save bennyfactor/4990066 to your computer and use it in GitHub Desktop.
How to framedrop, orient, transparentize, resize, and place one enormous animated gif on on top of another without making photoshop crush your soul/computer. requires p54-imagick (php imagemagick libs)
#!/usr/bin/php
<?
// Load the existing image
$image = new Imagick(dirname(__FILE__) . '/triangle-optical-illusion-1.gif');
// make animation into filmstrip form
$image = $image->coalesceImages();
$new_image = new Imagick();
$i = 1;
foreach ($image as $frame) {
if ($i % 3 != 0) {
// drop every third frame
echo $i % 3;
//create working frame
$clone = $frame->getImage();
//rotate image 90 degrees
$clone->rotateImage(new ImagickPixel(), 90);
//make background transparent
$clone->transparentPaintImage('#000100', 0, 10, false);
//make V bigger
$clone->resizeImage(480, 480, imagick::FILTER_CATROM, 1);
//write working frame to new image
$new_image->addImage($clone);
//set image disposal method
//2 blanks the image before adding the next frame
$new_image->setImageDispose(2);
}
$i++;
}
//undo coalesce
$new_image->deconstructImages();
//write out reoriented, transparentized V for funsies
$new_image->writeImages(dirname(__FILE__). '/ball-output.gif', true);
//merge images
$image2 = new Imagick(dirname(__FILE__). '/keepitlocked-edited.gif');
$image2 = $image2->coalesceImages();
$composite = new Imagick();
$j = 0;
foreach ($image2 as $frame2) {
$clone2 = $frame2->getImage();
//get the frame of the V analogous to the current KIL frame
$new_image->setImageIndex($j);
$intermediate =$new_image->getImage();
//paste v at center of keep it locked gif
$clone2->compositeImage($intermediate, Imagick::COMPOSITE_DEFAULT, 410, 90);
$clone2->flattenImages();
//downsize image to 570 x 320
$clone2->resizeImage(570, 320, imagick::FILTER_CATROM, 1);
$composite->addImage($clone2);
$composite->setImageDispose(3);
echo $j;
//belt and suspenders
if ($j == 242) { break;}
$j++;
}
//write out final gif
$composite->writeImages(dirname(__FILE__). '/output.gif', true);
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment