我很好奇是否有办法在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动画。那不是解决方案。
答案 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);
输出如下图像:
在编写动画gif文件时,请确保使用writeImages
而不是单数版本。