Skip to content

Commit

Permalink
Fixed reloading palette
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed Jun 28, 2021
1 parent 4616288 commit 1ee30de
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 11 deletions.
2 changes: 1 addition & 1 deletion Tests/test_image_convert.py
Expand Up @@ -93,7 +93,7 @@ def test_trns_p(tmp_path):
im_l.save(f)

im_rgb = im.convert("RGB")
assert im_rgb.info["transparency"] == (0, 0, 0) # undone
assert im_rgb.info["transparency"] == (0, 1, 2) # undone
im_rgb.save(f)


Expand Down
11 changes: 9 additions & 2 deletions Tests/test_imagepalette.py
Expand Up @@ -2,7 +2,7 @@

from PIL import Image, ImagePalette

from .helper import assert_image_equal_tofile
from .helper import assert_image_equal, assert_image_equal_tofile


def test_sanity():
Expand All @@ -14,6 +14,13 @@ def test_sanity():
ImagePalette.ImagePalette("RGB", list(range(256)) * 3, 10)


def test_reload():
im = Image.open("Tests/images/hopper.gif")
original = im.copy()
im.palette.dirty = 1
assert_image_equal(im.convert("RGB"), original.convert("RGB"))


def test_getcolor():

palette = ImagePalette.ImagePalette()
Expand Down Expand Up @@ -129,7 +136,7 @@ def test_getdata():
mode, data_out = palette.getdata()

# Assert
assert mode == "RGB;L"
assert mode == "RGB"


def test_rawmode_getdata():
Expand Down
10 changes: 3 additions & 7 deletions src/PIL/Image.py
Expand Up @@ -1834,23 +1834,19 @@ def remap_palette(self, dest_map, source_palette=None):
m_im = self.copy()
m_im.mode = "P"

m_im.palette = ImagePalette.ImagePalette(
"RGB", palette=mapping_palette * 3, size=768
)
m_im.palette = ImagePalette.ImagePalette("RGB", palette=mapping_palette * 3)
# possibly set palette dirty, then
# m_im.putpalette(mapping_palette, 'L') # converts to 'P'
# or just force it.
# UNDONE -- this is part of the general issue with palettes
m_im.im.putpalette(*m_im.palette.getdata())
m_im.im.putpalette("RGB;L", m_im.palette.tobytes())

m_im = m_im.convert("L")

# Internally, we require 768 bytes for a palette.
new_palette_bytes = palette_bytes + (768 - len(palette_bytes)) * b"\x00"
m_im.putpalette(new_palette_bytes)
m_im.palette = ImagePalette.ImagePalette(
"RGB", palette=palette_bytes, size=len(palette_bytes)
)
m_im.palette = ImagePalette.ImagePalette("RGB", palette=palette_bytes)

return m_im

Expand Down
2 changes: 1 addition & 1 deletion src/PIL/ImagePalette.py
Expand Up @@ -80,7 +80,7 @@ def getdata(self):
"""
if self.rawmode:
return self.rawmode, self.palette
return self.mode + ";L", self.tobytes()
return self.mode, self.tobytes()

def tobytes(self):
"""Convert palette to bytes.
Expand Down

0 comments on commit 1ee30de

Please sign in to comment.