Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert subsequent GIF frames to RGB or RGBA #5857

Merged
merged 4 commits into from Dec 6, 2021

Conversation

radarhere
Copy link
Member

@radarhere radarhere commented Nov 29, 2021

Resolves #1525
Resolves #1717
Resolves #1692
Resolves #1742
Resolves #2543
Resolves #2893
Resolves #4977
Resolves #5734
Resolves #5781
Resolves #5819
Resolves #5837

Each GIF frame can have its own palette, and each of those palettes can have up to 256 colors. So the second frame of a GIF image may have 512 colors, the third 768 colors, and so on.
However, Pillow keeps a GIF image as P (or L) mode as it loads new frames. P mode images can only have 256 colors at most.
This has lead to many issues complaining about colors in subsequent GIF frames.

This PR instead changes GIF images to RGB or RGBA once you seek to a subsequent frame.

Internally, this is done by simply converting the two P mode images to RGB(A), and then pasting one onto the other.

This finishes the thoughts I started in #3735. It also reverts part of #5333, since those changes are no longer necessary.

@radarhere radarhere added the GIF label Nov 29, 2021
@@ -340,12 +366,16 @@ def test_dispose_background():
def test_dispose_background_transparency():
with Image.open("Tests/images/dispose_bgnd_transparency.gif") as img:
img.seek(2)
px = img.convert("RGBA").load()
px = img.load()
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is now already an RGBA image.

@hugovk
Copy link
Member

hugovk commented Dec 6, 2021

Resolving 11 issues at once, must be a record!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment