GIF速度由帧延迟时间(duration)决定,修改该值即可调整速度。加速需减小数值,减速则增大数值。
以 PHP 代码为例:
$imagick = new \Imagick('input.gif');
foreach ($imagick as $frame) {
$frame->setImageDelay(20); // 加速:减小数值(如 20ms)
}
$imagick->writeImages('fast.gif', true);
setDelay / setImageDelay
:控制每帧的显示时间,单位是毫秒(ms)。默认值通常为 100ms(10帧/秒)。
加速
:减小数值(如 50ms);
减速
:增大数值(如 200ms)。
/**
* 调整 gif 播放速度
* 若 gif 每帧延时 0 毫秒则将其改为 10 毫秒
* 防止gif图片和播放器都没有设置播放速度导致快速播放的情况
* @param $imgData
* @return Imagick|mixed
*/
public function gifAdjustPlaySpeed($imgData): mixed
{
try {
$imagick = new Imagick();
$imagick->readImageBlob($imgData);
$imagick->setIteratorIndex(0); // 确保从第一帧开始
// 遍历每一帧并调整延迟时间
foreach ($imagick as $frame) {
$delay = $frame->getImageDelay(); // 获取当前帧的延迟时间
if ($delay <= 0) {
$frame->setImageDelay(10); // 每帧延时 10 毫秒
}
}
return $imagick->getImagesBlob();
} catch (Throwable $e) {
dp($e->getMessage(), $e->getTraceAsString());
return $imgData;
}
}