mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-26 17:24:31 +03:00
Merge pull request #6211 from radarhere/gif_loop
Netscape GIF extension belongs after the global color table
This commit is contained in:
commit
69f1b4a699
BIN
Tests/images/duplicate_number_of_loops.gif
Normal file
BIN
Tests/images/duplicate_number_of_loops.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
|
@ -772,9 +772,16 @@ def test_number_of_loops(tmp_path):
|
|||
im = Image.new("L", (100, 100), "#000")
|
||||
im.save(out, loop=number_of_loops)
|
||||
with Image.open(out) as reread:
|
||||
|
||||
assert reread.info["loop"] == number_of_loops
|
||||
|
||||
# Check that even if a subsequent GIF frame has the number of loops specified,
|
||||
# only the value from the first frame is used
|
||||
with Image.open("Tests/images/duplicate_number_of_loops.gif") as im:
|
||||
assert im.info["loop"] == 2
|
||||
|
||||
im.seek(1)
|
||||
assert im.info["loop"] == 2
|
||||
|
||||
|
||||
def test_background(tmp_path):
|
||||
out = str(tmp_path / "temp.gif")
|
||||
|
|
|
@ -244,7 +244,7 @@ class GifImageFile(ImageFile.ImageFile):
|
|||
info["comment"] = comment
|
||||
s = None
|
||||
continue
|
||||
elif s[0] == 255:
|
||||
elif s[0] == 255 and frame == 0:
|
||||
#
|
||||
# application extension
|
||||
#
|
||||
|
@ -252,7 +252,7 @@ class GifImageFile(ImageFile.ImageFile):
|
|||
if block[:11] == b"NETSCAPE2.0":
|
||||
block = self.data()
|
||||
if len(block) >= 3 and block[0] == 1:
|
||||
info["loop"] = i16(block, 1)
|
||||
self.info["loop"] = i16(block, 1)
|
||||
while self.data():
|
||||
pass
|
||||
|
||||
|
@ -399,7 +399,7 @@ class GifImageFile(ImageFile.ImageFile):
|
|||
|
||||
if info.get("comment"):
|
||||
self.info["comment"] = info["comment"]
|
||||
for k in ["duration", "extension", "loop"]:
|
||||
for k in ["duration", "extension"]:
|
||||
if k in info:
|
||||
self.info[k] = info[k]
|
||||
elif k in self.info:
|
||||
|
@ -716,18 +716,6 @@ def _write_local_header(fp, im, offset, flags):
|
|||
+ o8(0)
|
||||
)
|
||||
|
||||
if "loop" in im.encoderinfo:
|
||||
number_of_loops = im.encoderinfo["loop"]
|
||||
fp.write(
|
||||
b"!"
|
||||
+ o8(255) # extension intro
|
||||
+ o8(11)
|
||||
+ b"NETSCAPE2.0"
|
||||
+ o8(3)
|
||||
+ o8(1)
|
||||
+ o16(number_of_loops) # number of loops
|
||||
+ o8(0)
|
||||
)
|
||||
include_color_table = im.encoderinfo.get("include_color_table")
|
||||
if include_color_table:
|
||||
palette_bytes = _get_palette_bytes(im)
|
||||
|
@ -933,6 +921,17 @@ def _get_global_header(im, info):
|
|||
# Global Color Table
|
||||
_get_header_palette(palette_bytes),
|
||||
]
|
||||
if "loop" in info:
|
||||
header.append(
|
||||
b"!"
|
||||
+ o8(255) # extension intro
|
||||
+ o8(11)
|
||||
+ b"NETSCAPE2.0"
|
||||
+ o8(3)
|
||||
+ o8(1)
|
||||
+ o16(info["loop"]) # number of loops
|
||||
+ o8(0)
|
||||
)
|
||||
if info.get("comment"):
|
||||
comment_block = b"!" + o8(254) # extension intro
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user