如何使用从imagamagick转换将gif中的图像居中?

时间:2018-11-01 16:26:08

标签: bash imagemagick

我的目标是从jpg创建gif图像,该图像将以 A 角度旋转并延迟 D imagemagick。所以,我有以下代码:

npm start

问题是out.gif中的图像未居中。我如何居中? (图像应相对于中心旋转)

2 个答案:

答案 0 :(得分:1)

  

问题在于out.gif中的图像未居中。

当您查看最终的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>,该运算符可以一步一步旋转和裁剪。使用此运算符还将使动画看起来更流畅,请参见here。将您的-rotate $i替换为-distort SRT $i

答案 1 :(得分:0)

ImageMagick的“ -rotate”运算符将增加输出尺寸,因此整个输入图像仍适合输出。对于不同的旋转角度,这会产生各种尺寸的结果。使用加号形式的“ + distort SRT”将具有相同的效果。

“扭曲SRT”将使图像在其输入尺寸内居中旋转,但是当它们在原始帧外旋转时,将切掉角。

有一种方法可以旋转图像几次,以中心点为中心,并且在即使旋转时也可以容纳整个图像的视口中。

通过设置输入图像名称“ $ image”,帧数“ $ f”和每帧延迟“ $ d”,这样的命令可以完成“ for”循环所做的所有工作,同时消除了写入和读取临时文件。看起来比实际要复杂得多...

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格式输出最终结果。