提取保留基础 canvas 大小 + 偏移量的 GIF 帧

Extract GIF frames retaining base canvas size + offsets

我正在尝试使用 ImageMagik convert 命令提取 GIF 帧。 GIF 图像经过优化,仅覆盖动画变化(我相信他们称之为 mipmap),由于性能限制,这非常适合我的提取。如果我使用 -coalesce 我会失去优化,因为我在精灵中使用 GIF 帧 sheet 所以我需要按原样提取它但是当我使用标准 convert xxx.gif xxx.png 提取它时提取动画帧时没有偏移,canvas 尺寸与基本图像 (0) 不同。

我需要提取的所有图像与第一帧相匹配,并保留来自 GIF 元数据的偏移量。我不知道如何在 ImageMagik 中完成此操作,想知道这是否可行?

然后,如果我让它们的大小与应用的偏移量相匹配,我就可以轻松地将它们添加到精灵中 sheet。

非常感谢能得到的所有帮助!谢谢。

亲挑战!你接受吗?! :)

如果您提取为 GIF 而不是 PNG,似乎没问题:

convert animated.gif frame%d.gif

identify frame*
frame0.gif GIF 307x465 307x465+0+0 8-bit sRGB 256c 61.8KB 0.000u 0:00.000
frame1.gif[1] GIF 278x372 307x465+16+61 8-bit sRGB 256c 19.9KB 0.000u 0:00.000
frame10.gif[2] GIF 278x371 307x465+17+62 8-bit sRGB 256c 17.9KB 0.000u 0:00.000
frame11.gif[3] GIF 278x370 307x465+17+63 8-bit sRGB 256c 17.4KB 0.000u 0:00.000
frame12.gif[4] GIF 275x371 307x465+20+62 8-bit sRGB 256c 17.2KB 0.000u 0:00.000
frame13.gif[5] GIF 276x370 307x465+19+63 8-bit sRGB 256c 17.9KB 0.000u 0:00.000
frame14.gif[6] GIF 275x369 307x465+19+64 8-bit sRGB 256c 16.8KB 0.000u 0:00.000

如果你想把这些叠加到空白上 canvas,你可以这样做。我没有考虑太多,可能有更简单的方法,但现在...

#!/bin/bash
# Extract individual frames
convert animated.gif frame%d.gif

# Make a blank canvas same size as original
convert -size 307x465 xc:none canvas.gif
i=0
for f in frame*; do
   geom=$(identify -format "%X%Y" $f)
   convert canvas.gif $f -geometry $geom -composite +repage g_$i.gif
   ((i++))
done

或者您的意思是您希望所有帧都处于正确的相对位置,但一个接一个地在一个文件中的长序列中?

#!/bin/bash

# Extract individual frames
convert animated.gif frame%d.gif

# Make a blank canvas same size as original
convert -size 307x465 xc:none canvas.gif

# Paste individual frames onto blank canvas and append frames into long sequence
for f in frame*; do
   geom=$(identify -format "%X%Y" $f)
   convert canvas.gif $f -geometry $geom -composite +repage miff:-
done | convert - +append sequence.gif