Skip to content

Commit 5d72b7a

Browse files
committed
Validate size and rank when initializing RankFilter
1 parent d12af6d commit 5d72b7a

2 files changed

Lines changed: 26 additions & 8 deletions

File tree

‎Tests/test_image_filter.py‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,23 @@ def test_rankfilter_error(filter: ImageFilter.RankFilter) -> None:
136136

137137

138138
def test_rankfilter_properties() -> None:
139-
rankfilter = ImageFilter.RankFilter(1, 2)
139+
rankfilter = ImageFilter.RankFilter(3, 2)
140140

141-
assert rankfilter.size == 1
141+
assert rankfilter.size == 3
142142
assert rankfilter.rank == 2
143143

144+
with pytest.raises(ValueError, match="bad filter size"):
145+
ImageFilter.RankFilter(2, 1)
146+
with pytest.raises(ValueError, match="bad filter size"):
147+
ImageFilter.MaxFilter(2)
148+
with pytest.raises(ValueError, match="bad filter size"):
149+
ImageFilter.MedianFilter(2)
150+
with pytest.raises(ValueError, match="bad filter size"):
151+
ImageFilter.MinFilter(2)
152+
153+
with pytest.raises(ValueError, match="bad rank value"):
154+
ImageFilter.RankFilter(1, 1)
155+
144156

145157
def test_builtinfilter_p() -> None:
146158
builtin_filter = ImageFilter.BuiltinFilter()

‎src/PIL/ImageFilter.py‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ class RankFilter(Filter):
9999
name = "Rank"
100100

101101
def __init__(self, size: int, rank: int) -> None:
102+
if size % 2 == 0:
103+
msg = "bad filter size"
104+
raise ValueError(msg)
105+
if rank < 0 or rank >= size * size:
106+
msg = "bad rank value"
107+
raise ValueError(msg)
102108
self.size = size
103109
self.rank = rank
104110

@@ -121,8 +127,8 @@ class MedianFilter(RankFilter):
121127
name = "Median"
122128

123129
def __init__(self, size: int = 3) -> None:
124-
self.size = size
125-
self.rank = size * size // 2
130+
rank = size * size // 2
131+
super().__init__(size, rank)
126132

127133

128134
class MinFilter(RankFilter):
@@ -136,8 +142,8 @@ class MinFilter(RankFilter):
136142
name = "Min"
137143

138144
def __init__(self, size: int = 3) -> None:
139-
self.size = size
140-
self.rank = 0
145+
rank = 0
146+
super().__init__(size, rank)
141147

142148

143149
class MaxFilter(RankFilter):
@@ -151,8 +157,8 @@ class MaxFilter(RankFilter):
151157
name = "Max"
152158

153159
def __init__(self, size: int = 3) -> None:
154-
self.size = size
155-
self.rank = size * size - 1
160+
rank = size * size - 1
161+
super().__init__(size, rank)
156162

157163

158164
class ModeFilter(Filter):

0 commit comments

Comments
 (0)