<p>至少对于提取适当的单帧,可能有一个解决方案</p>
<p>所有帧(第一帧除外)的<a href="https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html?highlight=GIF#saving" rel="nofollow noreferrer">^{<cd1>}</a>方法设置为<code>2</code>,即“恢复到背景色”</p>
<p>浏览Pillow的源代码,您将找到相应的<a href="https://github.com/python-pillow/Pillow/blob/83c05aaf8daa930086257eb38b254f06808d13e5/src/PIL/GifImagePlugin.py#L264" rel="nofollow noreferrer">line where the disposal method ^{<cd2>} is considered</a>,在下面,您将发现:</p>
<pre class="lang-py prettyprint-override"><code># by convention, attempt to use transparency first
color = (
frame_transparency
if frame_transparency is not None
else self.info.get("background", 0)
)
self.dispose = Image.core.fill("P", dispose_size, color)
</code></pre>
<p>如果您检查有故障的帧,您会注意到不需要的框的深绿色位于调色板的<code>0</code>位置。因此,似乎选择了错误的颜色进行处理,因为–我不知道为什么–选择了上面的<code>else</code>案例,而不是使用透明度信息–应该在那里</p>
<p>那么,让我们忽略可能有问题的东西:</p>
<pre class="lang-py prettyprint-override"><code>from PIL import Image, ImageSequence
# Open GIF
gif = Image.open('223vK.gif')
# Initialize list of extracted frames
frames = []
for frame in ImageSequence.Iterator(gif):
# If dispose is set, and color is set to 0, use transparency information
if frame.dispose is not None and frame.dispose[0] == 0:
frame.dispose = Image.core.fill('P', frame.dispose.size,
frame.info['transparency'])
# Convert frame to RGBA
frames.append(frame.convert('RGBA'))
# Visualization overhead
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 8))
for i, f in enumerate(frames, start=1):
plt.subplot(8, 8, i), plt.imshow(f), plt.axis('off')
plt.tight_layout(), plt.show()
</code></pre>
<p>提取的帧如下所示:</p>
<p><a href="https://i.stack.imgur.com/vSk8X.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/vSk8X.png" alt="Output"/></a></p>
<p>这对我来说很好</p>
<p>如果碰巧,透明度信息实际上设置为<code>0</code>,那么这里不应该做任何伤害,因为我们(重新)设置了仍然正确的透明度信息</p>
<p>我不知道(重新)保存到GIF是否有效,因为帧现在处于<code>RGBA</code>模式,从那里保存到GIF也很棘手</p>
<pre class="lang-none prettyprint-override"><code>
System information
Platform: Windows-10-10.0.19041-SP0
Python: 3.9.1
PyCharm: 2021.1.3
Matplotlib: 3.4.2
Pillow: 8.3.1
</code></pre>