mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-26 01:46:18 +03:00
Merge pull request #5282 from radarhere/quantize
Set all transparent colors to be equal in quantize()
This commit is contained in:
commit
727533148e
|
@ -74,3 +74,13 @@ def test_quantize_dither_diff():
|
||||||
nodither = image.quantize(dither=0, palette=palette)
|
nodither = image.quantize(dither=0, palette=palette)
|
||||||
|
|
||||||
assert dither.tobytes() != nodither.tobytes()
|
assert dither.tobytes() != nodither.tobytes()
|
||||||
|
|
||||||
|
|
||||||
|
def test_transparent_colors_equal():
|
||||||
|
im = Image.new("RGBA", (1, 2), (0, 0, 0, 0))
|
||||||
|
px = im.load()
|
||||||
|
px[0, 1] = (255, 255, 255, 0)
|
||||||
|
|
||||||
|
converted = im.quantize()
|
||||||
|
converted_px = converted.load()
|
||||||
|
assert converted_px[0, 0] == converted_px[0, 1]
|
||||||
|
|
|
@ -1683,9 +1683,26 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
} else if (!strcmp(im->mode, "RGB") || !strcmp(im->mode, "RGBA")) {
|
} else if (!strcmp(im->mode, "RGB") || !strcmp(im->mode, "RGBA")) {
|
||||||
/* true colour */
|
/* true colour */
|
||||||
|
|
||||||
|
withAlpha = !strcmp(im->mode, "RGBA");
|
||||||
|
int transparency = 0;
|
||||||
|
unsigned char r, g, b;
|
||||||
for (i = y = 0; y < im->ysize; y++) {
|
for (i = y = 0; y < im->ysize; y++) {
|
||||||
for (x = 0; x < im->xsize; x++, i++) {
|
for (x = 0; x < im->xsize; x++, i++) {
|
||||||
p[i].v = im->image32[y][x];
|
p[i].v = im->image32[y][x];
|
||||||
|
if (withAlpha && p[i].c.a == 0) {
|
||||||
|
if (transparency == 0) {
|
||||||
|
transparency = 1;
|
||||||
|
r = p[i].c.r;
|
||||||
|
g = p[i].c.g;
|
||||||
|
b = p[i].c.b;
|
||||||
|
} else {
|
||||||
|
/* Set all subsequent transparent pixels
|
||||||
|
to the same colour as the first */
|
||||||
|
p[i].c.r = r;
|
||||||
|
p[i].c.g = g;
|
||||||
|
p[i].c.b = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1720,9 +1737,6 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
kmeans);
|
kmeans);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (!strcmp(im->mode, "RGBA")) {
|
|
||||||
withAlpha = 1;
|
|
||||||
}
|
|
||||||
result = quantize_octree(
|
result = quantize_octree(
|
||||||
p,
|
p,
|
||||||
im->xsize * im->ysize,
|
im->xsize * im->ysize,
|
||||||
|
@ -1734,9 +1748,6 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
#ifdef HAVE_LIBIMAGEQUANT
|
#ifdef HAVE_LIBIMAGEQUANT
|
||||||
if (!strcmp(im->mode, "RGBA")) {
|
|
||||||
withAlpha = 1;
|
|
||||||
}
|
|
||||||
result = quantize_pngquant(
|
result = quantize_pngquant(
|
||||||
p,
|
p,
|
||||||
im->xsize,
|
im->xsize,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user