我正在使用 Imagick 从我的帧数组创建动画 gif。我创建的示例 gif 按预期设置动画,但动画不会循环回到开头。
示例变量:
$durations = array(100, 100);
$loops = 0; // infinite
主要代码/create_gif()
$gif = new Imagick();
$gif->setFormat('gif');
for ($i = 0; $i < count($frames); $i++) {
$gif->addImage($frames[$i]);
$gif->setImageDelay($durations[$i]);
}
$gif->setImageIterations($loops);
$gif = $gif->deconstructImages();
$gif->writeImages('test.gif', true);
Here是我的示例 gif。正如您在加载页面时看到的那样,男人的头发向下摆动(这只是为了测试,在我花时间绘制实际帧之前)并且应该循环并向后摆动,但这种情况从未发生过。
为了循环播放 gif,我可以更改什么?
编辑 根据要求,这里是用于构建框架的(略微缩减的)代码:
// Build an array of still frames
$frames = array();
for ($i = 0; $i < $frame_num; $i++) {
// Build an array of image layers
$layers = array();
for ($j = 0; $j < 11; $j++) {
$layers[$j] = new Imagick();
$layers[$j]->readImage('path_to_this_layer.gif');
}
// Combine the image layers into a frame
$frames[$i] = create_frame($layers);
}
// Combine the frames into an animated gif
$gif = create_gif($image_string, $frames, $durations, $loops);
// create_gif() triggers the code I originally posted
创建框架():
$frame = new Imagick();
$frame->readImageBlob($layers[0]);
for ($i = 1; $i < count($layers); $i++) {
if ($layers[$i] != false) {
$frame->compositeImage($layers[$i], Imagick::COMPOSITE_DEFAULT, 0, 0);
}
}
$frame->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
return $frame;
最佳答案
终于折腾了很久,发现问题所在:
setImageIterations()
必须在 deconstructImages()
所以我的 gif_create() 函数现在如下所示:
$gif = new Imagick();
$gif->setFormat('gif');
for ($i = 0; $i < count($frames); $i++) {
$gif->addImage($frames[$i]);
$gif->setImageDelay($durations[$i]);
}
// These two were swapped around
$gif = $gif->deconstructImages();
$gif->setImageIterations($loops);
$gif->writeImages('test.gif', true);
希望我可以让其他人免于头痛,如果他们也将这两者混合在一起的话。
关于php - 使用 Imagick 创建的 Gif 不循环(PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29599951/