-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
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
Added setting for converting GIF P frames to RGB #6150
Merged
Merged
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
7928e94
Keep subsequent L frames without transparency as L
radarhere 66bb2bd
Added setting to convert first GIF frame to RGB
radarhere ce8c682
Added setting to convert to RGB only at a different palette
radarhere c5efe60
Reverted converting L with transparency to LA after first frame
radarhere 33022ee
Added versionadded
radarhere e22a439
Renamed setting
radarhere 5fb1ff6
Further explain GIF palettes combining
radarhere a7d36ef
Added release notes
radarhere 24054d8
Document how to restore original setting
radarhere File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -106,8 +106,34 @@ writes run-length encoded files in GIF87a by default, unless GIF89a features | |||||||||||||||
are used or GIF89a is already in use. | ||||||||||||||||
|
||||||||||||||||
GIF files are initially read as grayscale (``L``) or palette mode (``P``) | ||||||||||||||||
images, but seeking to later frames in an image will change the mode to either | ||||||||||||||||
``RGB`` or ``RGBA``, depending on whether the first frame had transparency. | ||||||||||||||||
images. Seeking to later frames in a ``P`` image will change the image to | ||||||||||||||||
``RGB`` (or ``RGBA`` if the first frame had transparency). | ||||||||||||||||
|
||||||||||||||||
``P`` mode images are changed to ``RGB`` because each frame of a GIF may contain | ||||||||||||||||
its own individual palette of up to 256 colors. When a new frame is placed onto a | ||||||||||||||||
previous frame, those colors may combine to exceed the ``P`` mode limit of 256 | ||||||||||||||||
colors. Instead, the image is converted to ``RGB`` handle this. | ||||||||||||||||
|
||||||||||||||||
If you would prefer the first ``P`` image frame to be ``RGB`` as well, so that | ||||||||||||||||
every ``P`` frame is converted to ``RGB`` or ``RGBA`` mode, there is a setting | ||||||||||||||||
available:: | ||||||||||||||||
|
||||||||||||||||
from PIL import GifImagePlugin | ||||||||||||||||
GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_ALWAYS | ||||||||||||||||
|
||||||||||||||||
GIF frames do not always contain individual palettes however. If there is only | ||||||||||||||||
a global palette, then all of the colors can fit within ``P`` mode. If you would | ||||||||||||||||
prefer the frames to be kept as ``P`` in that case, there is also a setting | ||||||||||||||||
available:: | ||||||||||||||||
|
||||||||||||||||
from PIL import GifImagePlugin | ||||||||||||||||
GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY | ||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It may be worth noting the name of the default option:
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, I've pushed a commit with a variation of this. |
||||||||||||||||
|
||||||||||||||||
To restore the default behavior, where ``P`` mode images are only converted to | ||||||||||||||||
``RGB`` or ``RGBA`` after the first frame:: | ||||||||||||||||
|
||||||||||||||||
from PIL import GifImagePlugin | ||||||||||||||||
GifImagePlugin.LOADING_STRATEGY = GifImagePlugin.LoadingStrategy.RGB_AFTER_FIRST | ||||||||||||||||
|
||||||||||||||||
The :py:meth:`~PIL.Image.open` method sets the following | ||||||||||||||||
:py:attr:`~PIL.Image.Image.info` properties: | ||||||||||||||||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, then I've misunderstood what
DIFFERENT_PALETTE_ONLY
does. What do you think of changing the part of the docs that threw me?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My hope is that a previous part of the documentation already conveys the idea that new frames are layered on top of old modes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, the part that you referenced provides the motivation for why the image is converted to
RGB
. What isn't clear yet (or at least wasn't clear to me when I read it) is that this behavior also applies if we don't convert toRGB
. Maybe we can rephrase the sentence you referenced to better convey that decoding happens in all cases:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've pushed a commit. What do you think?