Imagick: Удалить кадры из анимированного GIF?

На Linux Вы могли использовать inotifywait для автоматического выполнения команды каждый раз, когда содержание файла изменяется.

Редактирование: следующая команда фиксирует file.txt, как только она сохраняется:

inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh
5
задан hakre 23 February 2012 в 17:34
поделиться

2 ответа

Я просматривал документацию Imagick некоторое время и пробовал кое-что ... Но мне тоже не удалось сделать то, что вы хотите - итак, нас как минимум двое не могут найти чистый путь ^^

В любом случае, единственный способ удалить рамку из анимированного изображения в формате GIF - это создать новый, Я нашел единственный способ «удалить кадр»:

$new_image = new Imagick();

$i = 1;
foreach ($image as $frame) {
    if ($i===1 || $i===3) {
        // 3 frames ; we keep the first and third one
        // ie, remove the second one
        $new_image->addImage($frame->getImage());
    }
    $i++;
}

Итак:

  • создать новое изображение
  • перебрать кадры исходного изображения
  • , если текущий кадр - тот, который я хочу сохранить , скопируйте его в новое изображение


И, в конце концов, чтобы вывести изображение в браузер:

// To directly output to the browser
header('Content-Type: image/gif');
echo $new_image->getImagesBlob();

Или, чтобы записать его в файл:

// To write the new image to a file
// Must use writeImages, and not writeImage (multi-frames ! )
$new_image->writeImages(dirname(__FILE__) . '/animated-gif-output.gif', true);

Каждый из этих выходов содержит только первый и третий кадры; итак, работает ... Я нашел единственный способ «удалить кадр»:

$new_image = new Imagick();

$i = 1;
foreach ($image as $frame) {
    if ($i===1 || $i===3) {
        // 3 frames ; we keep the first and third one
        // ie, remove the second one
        $new_image->addImage($frame->getImage());
    }
    $i++;
}

Итак:

  • создать новое изображение
  • перебрать кадры исходного изображения
  • , если текущий кадр - тот, который я хочу сохранить , скопируйте его в новое изображение


И, в конце концов, чтобы вывести изображение в браузер:

// To directly output to the browser
header('Content-Type: image/gif');
echo $new_image->getImagesBlob();

Или, чтобы записать его в файл:

// To write the new image to a file
// Must use writeImages, and not writeImage (multi-frames ! )
$new_image->writeImages(dirname(__FILE__) . '/animated-gif-output.gif', true);

Каждый из этих выходов содержит только первый и третий кадры; итак, работает ...
Но, как вы сказали, это нехорошо : - (


Я думаю, это, вероятно, будет отлично работать для большинства изображений; у вас могут возникнуть проблемы с большими изображениями, но анимированные GIF-файлы обычно не такие уж большие ... не так ли?


Другой способ - использовать convert из командной строки ... Но ... не так уж и здорово, и я не нашел способа просто удалить фрейм с помощью те либо : - (

5
ответ дан 14 December 2019 в 08:57
поделиться

Я использовал только утилиты командной строки для IM.

convert srcImage.gif [0] dstImage.gif

Должен помочь, если я не забыл опцию.

[0] относится к первому кадру анимированной гифки.

2
ответ дан 14 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: