我的目标是从jpg创建gif图像,该图像将以 A 角度旋转并延迟 D imagemagick。所以,我有以下代码:
npm start
问题是out.gif中的图像未居中。我如何居中? (图像应相对于中心旋转)
答案 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。
我们可以看到,图像围绕其中心旋转,但是图像尺寸发生了变化。
当我们将这四个图像转换为一个gif动画时,我们必须为整个动画设置固定的尺寸,并在画布上设置每个帧的位置。在不提供更多信息的情况下,ImageMagick使用第一帧的尺寸作为动画的尺寸,并将每个帧放置在左上方。由于第一帧(旋转0°)最小,因此其他帧被裁剪。下图显示了将被裁剪的内容。
要解决此问题,我们有两种选择:
我会选择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格式输出最终结果。