想象动画图像位置

时间:2015-01-20 17:38:01

标签: animation imagick

我很好奇是否有办法在Imagick中制作图像的位置。到目前为止,我有这个:

// Adding layer functionality
protected function createCanvas( $asset )
{
    // Create new imagick layer
    $layer = new Imagick( $asset );
    $layer->thumbnailImage( $this->width, $this->height );

    $layer->evaluateImage(Imagick::EVALUATE_DIVIDE, 1, Imagick::CHANNEL_ALPHA);

    return $layer;
}

// Create base layer
$im = new Imagick(); 
$im->setBackgroundColor(new ImagickPixel('transparent'));
$im->readImage( 'beginner-crate-back.png );
$im->setImageFormat("png32");

// Set base
$this->base = $im;

// Add image that needs positioning
$layer = $this->createCanvas( 'pet.png' );
$this->base->compositeImage( $layer, Imagick::COMPOSITE_DEFAULT, 360, 170);

// Add top of cage
$layer = $this->createCanvas( 'beginner-crate-front.png' );
$this->base->compositeImage( $layer, Imagick::COMPOSITE_DEFAULT, 0, 0 );

$final = $this->base->flattenImages();

因此,在我添加需要定位的图像时,我将其放置在右侧360像素,底部170像素。但是,我想动画,所以顶部从0开始,慢慢增加到170加时。我不知道Imagick是否可以实现这一点,因为我需要底层和顶层与每一帧保持一致。

感谢您对如何实现这一目标的任何见解或帮助!宠物图像是动态生成的,因此我无法将该图像设置为GIF动画。那不是解决方案。

1 个答案:

答案 0 :(得分:1)

PNG不支持动画。虽然您的源图像可能是PNG,但您仍然可以使用它来制作动画GIF。例如类似的东西:

function makeSimpleGif() {
    $aniGif = new \Imagick();
    $aniGif->setFormat("gif");

    $circleRadius = 20;
    $imageFrames = 40;
    $imageSize = 200;

    $background = new \Imagick();
    $background->newpseudoimage($imageSize, $imageSize, "plasma:tomato-steelblue");

    //$pet = new Imagick(realpath('pet.png'));
    //I don't have your pet image - but change it back here...
    $pet = new \Imagick();
    $pet->newpseudoimage(20, 20, "canvas:white");

    $moveDistance = 170;

    for($count=0 ; $count<$imageFrames ; $count++){
        $frame = clone $background;
        $x = 20;
        $y = 10 + ($moveDistance * ($count / $imageFrames)); 
        $frame->compositeImage($pet, \Imagick::COMPOSITE_ATOP, $x, $y);
        $frame->setImageDelay(10);
        $aniGif->addImage($frame);
    }

    $aniGif = $aniGif->deconstructImages();

    return $aniGif;
}

$aniGif = makeSimpleGif();

$aniGif->writeImages("./aniOutput.gif", true);

输出如下图像:

enter image description here

在编写动画gif文件时,请确保使用writeImages而不是单数版本。