Skip to content

Commit f952d75

Browse files
committed
Support saving images with non-RGB palettes as PNGs
1 parent adb463c commit f952d75

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

Tests/test_file_png.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,16 @@ def test_plte_length(self, tmp_path: Path) -> None:
707707
assert reloaded.png.im_palette is not None
708708
assert len(reloaded.png.im_palette[1]) == 3
709709

710+
def test_plte_cmyk(self, tmp_path: Path) -> None:
711+
im = Image.new("P", (1, 1))
712+
im.putpalette((0, 100, 150, 200), "CMYK")
713+
714+
out = tmp_path / "temp.png"
715+
im.save(out)
716+
717+
with Image.open(out) as reloaded:
718+
assert reloaded.convert("CMYK").getpixel((0, 0)) == (200, 222, 232, 0)
719+
710720
def test_getxmp(self) -> None:
711721
with Image.open("Tests/images/color_snakes.png") as im:
712722
if ElementTree is None:

src/PIL/PngImagePlugin.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,6 +1353,9 @@ def _save(
13531353
mode = im.mode
13541354

13551355
outmode = mode
1356+
palette = []
1357+
if im.palette:
1358+
palette = im.getpalette() or []
13561359
if mode == "P":
13571360
#
13581361
# attempt to minimize storage requirements for palette images
@@ -1362,7 +1365,7 @@ def _save(
13621365
else:
13631366
# check palette contents
13641367
if im.palette:
1365-
colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1)
1368+
colors = max(min(len(palette) // 3, 256), 1)
13661369
else:
13671370
colors = 256
13681371

@@ -1435,7 +1438,7 @@ def _save(
14351438

14361439
if im.mode == "P":
14371440
palette_byte_number = colors * 3
1438-
palette_bytes = im.im.getpalette("RGB")[:palette_byte_number]
1441+
palette_bytes = bytes(palette[:palette_byte_number])
14391442
while len(palette_bytes) < palette_byte_number:
14401443
palette_bytes += b"\0"
14411444
chunk(fp, b"PLTE", palette_bytes)

0 commit comments

Comments
 (0)