Skip to content

Commit 3aa9326

Browse files
committed
Merge pull request #843 from uvNikita/gif_mode_fix
Fixed wrong mode of gif image.
2 parents 735d45b + 778768c commit 3aa9326

File tree

2 files changed

+11
-12
lines changed

2 files changed

+11
-12
lines changed

PIL/GifImagePlugin.py

+3-12
Original file line numberDiff line numberDiff line change
@@ -268,34 +268,25 @@ def _save(im, fp, filename):
268268
except IOError:
269269
pass # write uncompressed file
270270

271-
try:
272-
rawmode = RAWMODE[im.mode]
271+
if im.mode in RAWMODE:
273272
imOut = im
274-
except KeyError:
273+
else:
275274
# convert on the fly (EXPERIMENTAL -- I'm not sure PIL
276275
# should automatically convert images on save...)
277276
if Image.getmodebase(im.mode) == "RGB":
278277
palette_size = 256
279278
if im.palette:
280279
palette_size = len(im.palette.getdata()[1]) // 3
281280
imOut = im.convert("P", palette=1, colors=palette_size)
282-
rawmode = "P"
283281
else:
284282
imOut = im.convert("L")
285-
rawmode = "L"
286283

287284
# header
288285
try:
289286
palette = im.encoderinfo["palette"]
290287
except KeyError:
291288
palette = None
292289
im.encoderinfo["optimize"] = im.encoderinfo.get("optimize", True)
293-
if im.encoderinfo["optimize"]:
294-
# When the mode is L, and we optimize, we end up with
295-
# im.mode == P and rawmode = L, which fails.
296-
# If we're optimizing the palette, we're going to be
297-
# in a rawmode of P anyway.
298-
rawmode = 'P'
299290

300291
header, usedPaletteColors = getheader(imOut, palette, im.encoderinfo)
301292
for s in header:
@@ -352,7 +343,7 @@ def _save(im, fp, filename):
352343
o8(8)) # bits
353344

354345
imOut.encoderconfig = (8, interlace)
355-
ImageFile._save(imOut, fp, [("gif", (0,0)+im.size, 0, rawmode)])
346+
ImageFile._save(imOut, fp, [("gif", (0,0)+im.size, 0, RAWMODE[imOut.mode])])
356347

357348
fp.write(b"\0") # end of image data
358349

Tests/test_file_gif.py

+8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ def test(optimize):
3535
self.assertEqual(test(0), 800)
3636
self.assertEqual(test(1), 38)
3737

38+
def test_optimize_full_l(self):
39+
from io import BytesIO
40+
41+
im = Image.frombytes("L", (16, 16), bytes(bytearray(range(256))))
42+
file = BytesIO()
43+
im.save(file, "GIF", optimize=True)
44+
self.assertEqual(im.mode, "L")
45+
3846
def test_roundtrip(self):
3947
out = self.tempfile('temp.gif')
4048
im = lena()

0 commit comments

Comments
 (0)