mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-13 18:56:17 +03:00
Merge pull request #6060 from radarhere/palette
Consider palette size when converting and in getpalette()
This commit is contained in:
commit
1ec7be9a87
|
@ -74,4 +74,5 @@ def test_putpalette_with_alpha_values():
|
||||||
def test_rgba_palette(mode, palette):
|
def test_rgba_palette(mode, palette):
|
||||||
im = Image.new("P", (1, 1))
|
im = Image.new("P", (1, 1))
|
||||||
im.putpalette(palette, mode)
|
im.putpalette(palette, mode)
|
||||||
|
assert im.getpalette() == [1, 2, 3]
|
||||||
assert im.palette.colors == {(1, 2, 3, 4): 0}
|
assert im.palette.colors == {(1, 2, 3, 4): 0}
|
||||||
|
|
|
@ -108,3 +108,18 @@ def test_palette(method, color):
|
||||||
converted = im.quantize(method=method)
|
converted = im.quantize(method=method)
|
||||||
converted_px = converted.load()
|
converted_px = converted.load()
|
||||||
assert converted_px[0, 0] == converted.palette.colors[color]
|
assert converted_px[0, 0] == converted.palette.colors[color]
|
||||||
|
|
||||||
|
|
||||||
|
def test_small_palette():
|
||||||
|
# Arrange
|
||||||
|
im = hopper()
|
||||||
|
|
||||||
|
colors = (255, 0, 0, 0, 0, 255)
|
||||||
|
p = Image.new("P", (1, 1))
|
||||||
|
p.putpalette(colors)
|
||||||
|
|
||||||
|
# Act
|
||||||
|
im = im.quantize(palette=p)
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
assert len(im.getcolors()) == 2
|
||||||
|
|
|
@ -882,7 +882,7 @@ class Image:
|
||||||
if self.im and self.palette and self.palette.dirty:
|
if self.im and self.palette and self.palette.dirty:
|
||||||
# realize palette
|
# realize palette
|
||||||
mode, arr = self.palette.getdata()
|
mode, arr = self.palette.getdata()
|
||||||
palette_length = self.im.putpalette(mode, arr)
|
self.im.putpalette(mode, arr)
|
||||||
self.palette.dirty = 0
|
self.palette.dirty = 0
|
||||||
self.palette.rawmode = None
|
self.palette.rawmode = None
|
||||||
if "transparency" in self.info and mode in ("LA", "PA"):
|
if "transparency" in self.info and mode in ("LA", "PA"):
|
||||||
|
@ -894,9 +894,7 @@ class Image:
|
||||||
else:
|
else:
|
||||||
palette_mode = "RGBA" if mode.startswith("RGBA") else "RGB"
|
palette_mode = "RGBA" if mode.startswith("RGBA") else "RGB"
|
||||||
self.palette.mode = palette_mode
|
self.palette.mode = palette_mode
|
||||||
self.palette.palette = self.im.getpalette(palette_mode, palette_mode)[
|
self.palette.palette = self.im.getpalette(palette_mode, palette_mode)
|
||||||
: palette_length * len(palette_mode)
|
|
||||||
]
|
|
||||||
|
|
||||||
if self.im:
|
if self.im:
|
||||||
if cffi and USE_CFFI_ACCESS:
|
if cffi and USE_CFFI_ACCESS:
|
||||||
|
|
|
@ -1063,7 +1063,7 @@ _gaussian_blur(ImagingObject *self, PyObject *args) {
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_getpalette(ImagingObject *self, PyObject *args) {
|
_getpalette(ImagingObject *self, PyObject *args) {
|
||||||
PyObject *palette;
|
PyObject *palette;
|
||||||
int palettesize = 256;
|
int palettesize;
|
||||||
int bits;
|
int bits;
|
||||||
ImagingShuffler pack;
|
ImagingShuffler pack;
|
||||||
|
|
||||||
|
@ -1084,6 +1084,7 @@ _getpalette(ImagingObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
palettesize = self->image->palette->size;
|
||||||
palette = PyBytes_FromStringAndSize(NULL, palettesize * bits / 8);
|
palette = PyBytes_FromStringAndSize(NULL, palettesize * bits / 8);
|
||||||
if (!palette) {
|
if (!palette) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1672,9 +1673,11 @@ _putpalette(ImagingObject *self, PyObject *args) {
|
||||||
|
|
||||||
self->image->palette = ImagingPaletteNew(palette_mode);
|
self->image->palette = ImagingPaletteNew(palette_mode);
|
||||||
|
|
||||||
unpack(self->image->palette->palette, palette, palettesize * 8 / bits);
|
self->image->palette->size = palettesize * 8 / bits;
|
||||||
|
unpack(self->image->palette->palette, palette, self->image->palette->size);
|
||||||
|
|
||||||
return PyLong_FromLong(palettesize * 8 / bits);
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
|
@ -143,6 +143,7 @@ struct ImagingPaletteInstance {
|
||||||
char mode[IMAGING_MODE_LENGTH]; /* Band names */
|
char mode[IMAGING_MODE_LENGTH]; /* Band names */
|
||||||
|
|
||||||
/* Data */
|
/* Data */
|
||||||
|
int size;
|
||||||
UINT8 palette[1024]; /* Palette data (same format as image data) */
|
UINT8 palette[1024]; /* Palette data (same format as image data) */
|
||||||
|
|
||||||
INT16 *cache; /* Palette cache (used for predefined palettes) */
|
INT16 *cache; /* Palette cache (used for predefined palettes) */
|
||||||
|
|
|
@ -40,6 +40,7 @@ ImagingPaletteNew(const char *mode) {
|
||||||
palette->mode[IMAGING_MODE_LENGTH - 1] = 0;
|
palette->mode[IMAGING_MODE_LENGTH - 1] = 0;
|
||||||
|
|
||||||
/* Initialize to ramp */
|
/* Initialize to ramp */
|
||||||
|
palette->size = 256;
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++) {
|
||||||
palette->palette[i * 4 + 0] = palette->palette[i * 4 + 1] =
|
palette->palette[i * 4 + 0] = palette->palette[i * 4 + 1] =
|
||||||
palette->palette[i * 4 + 2] = (UINT8)i;
|
palette->palette[i * 4 + 2] = (UINT8)i;
|
||||||
|
@ -193,7 +194,7 @@ ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) {
|
||||||
|
|
||||||
dmax = (unsigned int)~0;
|
dmax = (unsigned int)~0;
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < palette->size; i++) {
|
||||||
int r, g, b;
|
int r, g, b;
|
||||||
unsigned int tmin, tmax;
|
unsigned int tmin, tmax;
|
||||||
|
|
||||||
|
@ -226,7 +227,7 @@ ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) {
|
||||||
d[i] = (unsigned int)~0;
|
d[i] = (unsigned int)~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < palette->size; i++) {
|
||||||
if (dmin[i] <= dmax) {
|
if (dmin[i] <= dmax) {
|
||||||
int rd, gd, bd;
|
int rd, gd, bd;
|
||||||
int ri, gi, bi;
|
int ri, gi, bi;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user