From 2276111bb56aa08f815b8790763dfaae3fb6578f Mon Sep 17 00:00:00 2001
From: "James R. Barlow" <james@purplerock.ca>
Date: Fri, 15 Apr 2022 00:58:07 -0700
Subject: [PATCH 3/3] Fix palette handling for Pillow 9.1.0
(cherry picked from commit 4f6923fe33c2d7e78d1482a5eb2beb6e9155977b)
---
src/pikepdf/models/image.py | 8 ++++----
tests/test_image_access.py | 3 ++-
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/pikepdf/models/image.py b/src/pikepdf/models/image.py
index 632036e..e3d6aff 100644
--- a/src/pikepdf/models/image.py
+++ b/src/pikepdf/models/image.py
@@ -484,12 +484,12 @@ class PdfImage(PdfImageBase):
if self.mode == 'P' and self.bits_per_component == 1:
# Fix paletted 1-bit images
base_mode, palette = self.palette
- if base_mode == 'RGB' and palette != b'\x00\x00\x00\xff\xff\xff':
+ if base_mode == 'RGB':
im = im.convert('P')
+ if len(palette) == 6:
+ # rgbrgb -> rgb000000...rgb
+ palette = palette[0:3] + (b'\x00\x00\x00' * (256 - 2)) + palette[3:6]
im.putpalette(palette, rawmode=base_mode)
- gp = im.getpalette()
- gp[765:768] = gp[3:6] # work around Pillow bug
- im.putpalette(gp)
elif base_mode == 'L' and palette != b'\x00\xff':
im = im.convert('P')
im.putpalette(palette, rawmode=base_mode)
diff --git a/tests/test_image_access.py b/tests/test_image_access.py
index 55624e4..dd33b2c 100644
--- a/tests/test_image_access.py
+++ b/tests/test_image_access.py
@@ -297,7 +297,8 @@ def test_image_palette(resources, filename, bpc, rgb):
outstream = BytesIO()
pim.extract_to(stream=outstream)
- im = pim.as_pil_image().convert('RGB')
+ im_pal = pim.as_pil_image()
+ im = im_pal.convert('RGB')
assert im.getpixel((1, 1)) == rgb
--
2.39.2