Как центрировать изображения в gif с помощью конвертирования из imagamagick? - PullRequest
0 голосов
/ 01 ноября 2018

Моя цель - создать gif-изображение из jpg, которое я поверну на угол A с задержкой D imagemagick. Итак, у меня есть этот код:

for (( i=0; i < 360; i+=$a )) do
   name=%(printf "%03d" $i)
   convert $image -rotate $i "temp/$name.jpg"
done
convert -delay $d "temp/*.jpg" out.gif

Проблема в том, что изображения в out.gif не центрированы. Как я могу отцентрировать их? (изображение должно быть повернуто относительно центра)

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Оператор ImageMagick «-rotate» увеличивает выходные размеры, поэтому все входное изображение по-прежнему вписывается в выходные данные. Это дает результаты с различными размерами для разных углов поворота. Использование плюсовой формы "+ distort SRT" будет иметь тот же эффект.

И "-distort SRT" будет вращать изображение по центру внутри его входных размеров, но это будет срезать углы, когда они вращаются за пределами исходного кадра.

Существует способ несколько раз повернуть изображение, поворачивая его по центральной точке и в окне просмотра, в котором размещается все изображение, даже когда оно повернуто.

Устанавливая имя входного изображения «$ image», количество кадров «$ f» и задержку на кадр «$ d», команда, подобная этой, может делать все, что делает цикл «для», исключая при этом запись и чтение временных файлов. Это выглядит сложнее, чем есть на самом деле ...

image=input.jpg
f=20
d=50
convert -delay $d -dispose previous "$image" -background none -virtual-pixel none \
   -duplicate $f +delete -set option:distort:viewport "%[fx:hypot(w,h)]x%[fx:hypot(w,h)]" \
   -distort SRT "%[fx:w/2],%[fx:h/2] 1 %[fx:360/n*t] %[fx:hypot(w,h)/2],%[fx:hypot(w,h)/2]" \
   out.gif

Эта команда будет читать входные данные "$ image", дублировать их, чтобы создать в общей сложности кадры "$ f", установить задержку на "$ d", повернуть каждое изображение на 360 / $ f "градусов больше, чем предыдущее и выведите окончательный результат в виде анимированного GIF-файла.

0 голосов
/ 01 ноября 2018

Проблема в том, что изображения в out.gif не центрированы.

Просто так кажется, когда смотришь на последний гиф. Однако изображение уже вращается вокруг своего центра. Пример: у меня есть изображение 1.png и я поворачиваю его с шагом 15 °.

convert 1.png -rotate 15 2.png
convert 1.png -rotate 30 3.png
convert 1.png -rotate 45 4.png

Теперь давайте посмотрим на изображения 1-4.

rotated images

Как мы видим, изображение вращается вокруг своего центра, но размер изображения меняется.

Когда мы конвертируем эти четыре изображения в одну анимацию GIF, мы должны установить фиксированное измерение для всей анимации и положение каждого кадра на холсте. Не предоставляя дополнительной информации, ImageMagick использует измерение первого кадра в качестве измерения анимации и размещает каждый кадр в верхнем левом углу. Так как первый кадр (вращение 0 °) самый маленький, остальные кадры обрезаются. На следующем рисунке показано, что будет обрезано.

animation

Для решения проблемы у нас есть два варианта:

  1. При создании анимации центрируйте каждый кадр.
  2. При повороте обрезать результат так, чтобы все кадры имели одинаковый размер.

Я бы пошел с 2. ImageMagick имеет оператор -distort SRT <ANGLE>, который вращается и обрезает за один шаг. Использование этого оператора также будет выглядеть более плавно в анимации, см. здесь . Замените ваш -rotate $i на -distort SRT $i.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...