Skip to content

Commit 2dedeef

Browse files
committed
Support unpacking more rawmodes to RGBA palette
1 parent d879f39 commit 2dedeef

File tree

5 files changed

+12
-10
lines changed

5 files changed

+12
-10
lines changed

Tests/test_image_putpalette.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def test_putpalette_with_alpha_values() -> None:
7979
(
8080
("RGBA", (1, 2, 3, 4)),
8181
("RGBAX", (1, 2, 3, 4, 0)),
82+
("ARGB", (4, 1, 2, 3)),
8283
),
8384
)
8485
def test_rgba_palette(mode: str, palette: tuple[int, ...]) -> None:

src/PIL/DdsImagePlugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ def _open(self) -> None:
379379
elif pfflags & DDPF.PALETTEINDEXED8:
380380
self._mode = "P"
381381
self.palette = ImagePalette.raw("RGBA", self.fp.read(1024))
382+
self.palette.mode = "RGBA"
382383
elif pfflags & DDPF.FOURCC:
383384
offset = header_size + 4
384385
if fourcc == D3DFMT.DXT1:

src/PIL/GifImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ def load_prepare(self) -> None:
429429
self._prev_im = self.im
430430
if self._frame_palette:
431431
self.im = Image.core.fill("P", self.size, self._frame_transparency or 0)
432-
self.im.putpalette(*self._frame_palette.getdata())
432+
self.im.putpalette("RGB", *self._frame_palette.getdata())
433433
else:
434434
self.im = None
435435
self._mode = temp_mode

src/PIL/Image.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,7 @@ def load(self):
873873
if self.im is not None and self.palette and self.palette.dirty:
874874
# realize palette
875875
mode, arr = self.palette.getdata()
876-
self.im.putpalette(mode, arr)
876+
self.im.putpalette(self.palette.mode, mode, arr)
877877
self.palette.dirty = 0
878878
self.palette.rawmode = None
879879
if "transparency" in self.info and mode in ("LA", "PA"):
@@ -883,9 +883,9 @@ def load(self):
883883
self.im.putpalettealphas(self.info["transparency"])
884884
self.palette.mode = "RGBA"
885885
else:
886-
palette_mode = "RGBA" if mode.startswith("RGBA") else "RGB"
887-
self.palette.mode = palette_mode
888-
self.palette.palette = self.im.getpalette(palette_mode, palette_mode)
886+
self.palette.palette = self.im.getpalette(
887+
self.palette.mode, self.palette.mode
888+
)
889889

890890
if self.im is not None:
891891
if cffi and USE_CFFI_ACCESS:
@@ -1998,7 +1998,7 @@ def putpalette(self, data, rawmode="RGB") -> None:
19981998
palette = ImagePalette.raw(rawmode, data)
19991999
self._mode = "PA" if "A" in self.mode else "P"
20002000
self.palette = palette
2001-
self.palette.mode = "RGB"
2001+
self.palette.mode = "RGBA" if "A" in rawmode else "RGB"
20022002
self.load() # install new palette
20032003

20042004
def putpixel(self, xy, value):
@@ -2113,7 +2113,7 @@ def remap_palette(self, dest_map, source_palette=None):
21132113
# m_im.putpalette(mapping_palette, 'L') # converts to 'P'
21142114
# or just force it.
21152115
# UNDONE -- this is part of the general issue with palettes
2116-
m_im.im.putpalette(palette_mode + ";L", m_im.palette.tobytes())
2116+
m_im.im.putpalette(palette_mode, palette_mode + ";L", m_im.palette.tobytes())
21172117

21182118
m_im = m_im.convert("L")
21192119

src/_imaging.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1725,10 +1725,11 @@ _putpalette(ImagingObject *self, PyObject *args) {
17251725
ImagingShuffler unpack;
17261726
int bits;
17271727

1728-
char *rawmode, *palette_mode;
1728+
char *palette_mode, *rawmode;
17291729
UINT8 *palette;
17301730
Py_ssize_t palettesize;
1731-
if (!PyArg_ParseTuple(args, "sy#", &rawmode, &palette, &palettesize)) {
1731+
if (!PyArg_ParseTuple(
1732+
args, "ssy#", &palette_mode, &rawmode, &palette, &palettesize)) {
17321733
return NULL;
17331734
}
17341735

@@ -1738,7 +1739,6 @@ _putpalette(ImagingObject *self, PyObject *args) {
17381739
return NULL;
17391740
}
17401741

1741-
palette_mode = strncmp("RGBA", rawmode, 4) == 0 ? "RGBA" : "RGB";
17421742
unpack = ImagingFindUnpacker(palette_mode, rawmode, &bits);
17431743
if (!unpack) {
17441744
PyErr_SetString(PyExc_ValueError, wrong_raw_mode);

0 commit comments

Comments
 (0)