From 11df01145dea9a7afbcf9cec3f6bd0587f970f3b Mon Sep 17 00:00:00 2001 From: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com> Date: Tue, 28 Jan 2025 00:29:21 +0100 Subject: [PATCH] Backport PR #29520: FIX: Correct variable name from _frame to _frames in PillowWriter class --- lib/matplotlib/animation.py | 2 +- lib/matplotlib/tests/test_animation.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py index 2be61284073a..a87f00201124 100644 --- a/lib/matplotlib/animation.py +++ b/lib/matplotlib/animation.py @@ -496,7 +496,7 @@ def grab_frame(self, **savefig_kwargs): "RGBA", self.frame_size, buf.getbuffer(), "raw", "RGBA", 0, 1) if im.getextrema()[3][0] < 255: # This frame has transparency, so we'll just add it as is. - self._frame.append(im) + self._frames.append(im) else: # Without transparency, we switch to RGB mode, which converts to P mode a # little better if needed (specifically, this helps with GIF output.) diff --git a/lib/matplotlib/tests/test_animation.py b/lib/matplotlib/tests/test_animation.py index d026dae59533..e3382f662c73 100644 --- a/lib/matplotlib/tests/test_animation.py +++ b/lib/matplotlib/tests/test_animation.py @@ -13,6 +13,7 @@ import matplotlib as mpl from matplotlib import pyplot as plt from matplotlib import animation +from matplotlib.animation import PillowWriter from matplotlib.testing.decorators import check_figures_equal @@ -551,3 +552,20 @@ def test_movie_writer_invalid_path(anim): with pytest.raises(FileNotFoundError, match=match_str): anim.save("/foo/bar/aardvark/thiscannotreallyexist.mp4", writer=animation.FFMpegFileWriter()) + + +def test_animation_with_transparency(): + """Test animation exhaustion with transparency using PillowWriter directly""" + fig, ax = plt.subplots() + rect = plt.Rectangle((0, 0), 1, 1, color='red', alpha=0.5) + ax.add_patch(rect) + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + writer = PillowWriter(fps=30) + writer.setup(fig, 'unused.gif', dpi=100) + writer.grab_frame(transparent=True) + frame = writer._frames[-1] + # Check that the alpha channel is not 255, so frame has transparency + assert frame.getextrema()[3][0] < 255 + plt.close(fig)