diff --git a/Tests/test_image_filter.py b/Tests/test_image_filter.py index 6fe6b594f61..3f1c38be3da 100644 --- a/Tests/test_image_filter.py +++ b/Tests/test_image_filter.py @@ -228,3 +228,13 @@ def test_invalid_box_blur_filter(radius: int | tuple[int, int]) -> None: box_blur_filter.radius = radius with pytest.raises(ValueError): im.filter(box_blur_filter) + + +def test_rankfilter_size_1() -> None: + im = Image.new("L", (3, 3), 128) + + # Size 1 should not crash (margin is 0) + assert im.filter(ImageFilter.MinFilter(1)).getpixel((1, 1)) == 128 + assert im.filter(ImageFilter.MaxFilter(1)).getpixel((1, 1)) == 128 + assert im.filter(ImageFilter.MedianFilter(1)).getpixel((1, 1)) == 128 + assert im.filter(ImageFilter.RankFilter(1, 0)).getpixel((1, 1)) == 128 diff --git a/src/_imaging.c b/src/_imaging.c index 3cd762ff5c1..2bb3c9743c4 100644 --- a/src/_imaging.c +++ b/src/_imaging.c @@ -1115,6 +1115,9 @@ _expand_image(ImagingObject *self, PyObject *args) { return NULL; } + if (m == 0) { + return PyImagingNew(ImagingCopy(self->image)); + } return PyImagingNew(ImagingExpand(self->image, m)); } diff --git a/src/libImaging/Filter.c b/src/libImaging/Filter.c index b5f971d40c2..76b5cd486f2 100644 --- a/src/libImaging/Filter.c +++ b/src/libImaging/Filter.c @@ -56,7 +56,7 @@ ImagingExpand(Imaging imIn, int margin) { if (margin < 0) { return (Imaging)ImagingError_ValueError("bad kernel size"); } - if (margin > INT_MAX / (margin * (int)sizeof(FLOAT32))) { + if (margin > 0 && margin > INT_MAX / (margin * (int)sizeof(FLOAT32))) { return (Imaging)ImagingError_ValueError("filter size too large"); }