Do not allow floodfill to extend into negative coordinates

This commit is contained in:
Andrew Murray 2019-08-10 05:51:10 +10:00
parent 6de118abd3
commit 23872c0645
3 changed files with 21 additions and 2 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

View File

@ -559,6 +559,24 @@ class TestImageDraw(PillowTestCase):
# Assert # Assert
self.assert_image_equal(im, Image.open("Tests/images/imagedraw_floodfill2.png")) self.assert_image_equal(im, Image.open("Tests/images/imagedraw_floodfill2.png"))
def test_floodfill_not_negative(self):
# floodfill() is experimental
# Test that floodfill does not extend into negative coordinates
# Arrange
im = Image.new("RGB", (W, H))
draw = ImageDraw.Draw(im)
draw.line((W / 2, 0, W / 2, H / 2), fill="green")
draw.line((0, H / 2, W / 2, H / 2), fill="green")
# Act
ImageDraw.floodfill(im, (int(W / 4), int(H / 4)), ImageColor.getrgb("red"))
# Assert
self.assert_image_equal(
im, Image.open("Tests/images/imagedraw_floodfill_not_negative.png")
)
def create_base_image_draw( def create_base_image_draw(
self, size, mode=DEFAULT_MODE, background1=WHITE, background2=GRAY self, size, mode=DEFAULT_MODE, background1=WHITE, background2=GRAY
): ):

View File

@ -437,8 +437,9 @@ def floodfill(image, xy, value, border=None, thresh=0):
new_edge = set() new_edge = set()
for (x, y) in edge: # 4 adjacent method for (x, y) in edge: # 4 adjacent method
for (s, t) in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): for (s, t) in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)):
if (s, t) in full_edge: # If already processed, or if a coordinate is negative, skip
continue # if already processed, skip if (s, t) in full_edge or s < 0 or t < 0:
continue
try: try:
p = pixel[s, t] p = pixel[s, t]
except (ValueError, IndexError): except (ValueError, IndexError):