PHP Image Zoom — Экспоненциальная шкала

Я пытаюсь вычислить эффект увеличения между 12 изображениями. Каждое изображение на 100% больше предыдущего. Его приближается к идеальному, но есть только проблема при переходе между изображениями. Это не плавный зум между каждым изображением.
Пожалуйста, посмотрите видео: http://youtu.be/dUBbDjewpO0

Я думаю, что Экспоненциальное выражение pow () не является правильным по какой-то причине.
Вот скрипт PHP, но я не могу найти проблему:

 <?php
$imageFiles=array(
'1.jpg',
'2.jpg',
'3.jpg',
'4.jpg');
$targetFrameRate=$targetDuration='18';
$imageCount = count($imageFiles);
$totalFrames        = ($targetFrameRate*$targetDuration);
$sourceIndex  = 0;
$firstIndex   = 1;
$lastIndex    = $totalFrames; //==total frames
$currentScale = 1;//image scaling for first scale
$deltaScale   = ((($imageCount-1)*($scaleFactor-$currentScale))/$totalFrames);

for ($i=$firstIndex; $i<=$lastIndex; $i++) {

// prepare filename

$filename = createImageFilename($i, $imageType);

// determine source..
if ($i == $firstIndex) {
$newSourceIndex = 0;
}
else if ($i == $lastIndex) {
$newSourceIndex = ($imageCount-1);
}
else {
$newSourceIndex = intval(($i*($imageCount-1))/$totalFrames);

}
// create frame..
if ($newSourceIndex != $sourceIndex) {
$sourceIndex  = $newSourceIndex;
$currentScale = pow($scaleFactor, $sourceIndex);
$nextScale    = pow($scaleFactor, ($sourceIndex+1));
$deltaScale   = ((($imageCount-1)*($nextScale-$currentScale))/$totalFrames);

copyImage($imageFiles[$sourceIndex],
sprintf('%s/%s', $outputDir, $filename),
$imageWidth,
$imageHeight,
$imageType);
}
else {
createImage($imageFiles[$sourceIndex],
sprintf('%s/%s', $outputDir, $filename),
($currentScale/pow($scaleFactor, $sourceIndex)),
$imageWidth,
$imageHeight,
$imageType);
}

//DEBUG: buffer some values for optional debug-output
if (isDebugOutputEnabled()) {
$debug_idx[$i] = $filename;
$debug_inf[$i] = sprintf('sourceIndex=%d , scale=%01.2f<br />', $sourceIndex, $currentScale);
}
// advance..
$currentScale += $deltaScale;
}


?>

рендеринг хорошо

  shell_exec('ffmpeg -f image2 -i /var/www/htdocs/image2/i%d.jpg -s 1280x720 -movflags faststart -b:v 5500k -r 18 output.flv');

3

Решение

Проблема заключается в том, что вы добавляете дельту к своей шкале, а не умножаете ее на постоянную величину в каждом кадре:

$currentScale += $deltaScale;

Экспоненциальный масштаб означает, что вы увеличиваете масштаб на постоянную величину фактор (не разница) в течение определенного постоянного времени, поэтому вам нужно изменить эту строку на:

$currentScale *= $deltaScale;

а также рассчитать $deltaScale по-другому:

$deltaScale = pow($nextScale / $currentScale, ($imageCount-1) / $totalFrames);

Это вычислит дробную степень разницы масштаба между изображениями, так что при умножении ее на $currentScale значение $totalFrames / ($imageCount-1) раз (число кадров, которые вы отображаете между текущим масштабом и следующим масштабом), результат будет увеличиваться с коэффициентом $nextScale / $currentScale,

Упрощение:

Поскольку масштабирование с постоянной скоростью для всей анимации, $deltaScale постоянна все время, так что вы можете вычислить его вне цикла следующим образом:

$deltaScale = pow($scaleFactor, ($imageCount-1) / $totalFrames);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector