diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 83c54cf62..62decb36a 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -281,6 +281,13 @@ class TestImageResize: im = hopper(mode) assert im.resize((20, 20), Image.Resampling.BICUBIC) == im.resize((20, 20)) + def test_bicubic_f_clipping(self): + im = Image.new("F", (1, 2)) + im.putpixel((0, 1), 1) + + im = im.resize((1, 3), Image.BICUBIC) + assert im.getpixel((0, 0)) >= 0 + @pytest.mark.parametrize( "mode", ("1", "P", "I;16", "I;16L", "I;16B", "BGR;15", "BGR;16") ) diff --git a/src/libImaging/Resample.c b/src/libImaging/Resample.c index cf79d8a4e..bf124cd0e 100644 --- a/src/libImaging/Resample.c +++ b/src/libImaging/Resample.c @@ -535,6 +535,9 @@ ImagingResampleVertical_32bpc( for (y = 0; y < ymax; y++) { ss += IMAGING_PIXEL_F(imIn, xx, y + ymin) * k[y]; } + if (ss < 0) { + ss = 0; + } IMAGING_PIXEL_F(imOut, xx, yy) = ss; } }