Skip to content

Commit

Permalink
Fixed bug with rounding pixels to palette
Browse files Browse the repository at this point in the history
This fixes a bug with rounding pixels to the nearest palette color. Specifically, there is a typo with computing the minimum distance from a palette color to a given cache box. This is causing palette colors to be incorrectly excluded from consideration.
  • Loading branch information
btrekkie committed Jun 18, 2022
1 parent 765d66c commit 9f9e265
Show file tree
Hide file tree
Showing 8 changed files with 11 additions and 9 deletions.
Binary file modified Tests/images/palette_negative.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Tests/images/palette_sepia.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Tests/images/palette_wedge.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion Tests/test_image_entropy.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def entropy(mode):
assert round(abs(entropy("L") - 7.063008716585465), 7) == 0
assert round(abs(entropy("I") - 7.063008716585465), 7) == 0
assert round(abs(entropy("F") - 7.063008716585465), 7) == 0
assert round(abs(entropy("P") - 5.0530452472519745), 7) == 0
assert round(abs(entropy("P") - 5.082506854662517), 7) == 0
assert round(abs(entropy("RGB") - 8.821286587714319), 7) == 0
assert round(abs(entropy("RGBA") - 7.42724306524488), 7) == 0
assert round(abs(entropy("CMYK") - 7.4272430652448795), 7) == 0
Expand Down
2 changes: 1 addition & 1 deletion Tests/test_image_getcolors.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def getcolors(mode, limit=None):
assert getcolors("L") == 255
assert getcolors("I") == 255
assert getcolors("F") == 255
assert getcolors("P") == 90 # fixed palette
assert getcolors("P") == 96 # fixed palette
assert getcolors("RGB") is None
assert getcolors("RGBA") is None
assert getcolors("CMYK") is None
Expand Down
2 changes: 1 addition & 1 deletion Tests/test_image_histogram.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def histogram(mode):
assert histogram("L") == (256, 0, 662)
assert histogram("I") == (256, 0, 662)
assert histogram("F") == (256, 0, 662)
assert histogram("P") == (256, 0, 1871)
assert histogram("P") == (256, 0, 1551)
assert histogram("RGB") == (768, 4, 675)
assert histogram("RGBA") == (1024, 0, 16384)
assert histogram("CMYK") == (1024, 0, 16384)
Expand Down
8 changes: 5 additions & 3 deletions docs/releasenotes/9.2.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,9 @@ TODO
Other Changes
=============

TODO
^^^^
Fixed bug with rounding pixels to palette
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

TODO
Fixed a bug when rounding image pixels to palette colors. This affects the results of
``Image.quantize`` and of ``Image.convert`` when converting from mode "RGB" to "P",
"L", or "1", regardless of whether dithering is enabled.
6 changes: 3 additions & 3 deletions src/libImaging/Palette.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,15 +200,15 @@ ImagingPaletteCacheUpdate(ImagingPalette palette, int r, int g, int b) {

/* Find min and max distances to any point in the box */
r = palette->palette[i * 4 + 0];
tmin = (r < r0) ? RDIST(r, r1) : (r > r1) ? RDIST(r, r0) : 0;
tmin = (r < r0) ? RDIST(r, r0) : (r > r1) ? RDIST(r, r1) : 0;
tmax = (r <= rc) ? RDIST(r, r1) : RDIST(r, r0);

g = palette->palette[i * 4 + 1];
tmin += (g < g0) ? GDIST(g, g1) : (g > g1) ? GDIST(g, g0) : 0;
tmin += (g < g0) ? GDIST(g, g0) : (g > g1) ? GDIST(g, g1) : 0;
tmax += (g <= gc) ? GDIST(g, g1) : GDIST(g, g0);

b = palette->palette[i * 4 + 2];
tmin += (b < b0) ? BDIST(b, b1) : (b > b1) ? BDIST(b, b0) : 0;
tmin += (b < b0) ? BDIST(b, b0) : (b > b1) ? BDIST(b, b1) : 0;
tmax += (b <= bc) ? BDIST(b, b1) : BDIST(b, b0);

dmin[i] = tmin;
Expand Down

0 comments on commit 9f9e265

Please sign in to comment.