diff --git a/PIL/Image.py b/PIL/Image.py index 4c9a77e79..5e1416a33 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1910,6 +1910,16 @@ class Image: im = self.im.transpose(method) return self._new(im) + def effect_spread(self, distance): + """ + Randomly spread pixels in an image. + + :param distance: Distance to spread pixels. + """ + self.load() + im = self.im.effect_spread(distance) + return self._new(im) + # -------------------------------------------------------------------- # Lazy operations @@ -2436,6 +2446,7 @@ def effect_mandelbrot(size, extent, quality): """ return Image()._new(core.effect_mandelbrot(size, extent, quality)) + def effect_noise(size, sigma): """ Generate Gaussian noise centered around 128. diff --git a/Tests/images/mandelbrot.png b/Tests/images/effect_mandelbrot.png similarity index 100% rename from Tests/images/mandelbrot.png rename to Tests/images/effect_mandelbrot.png diff --git a/Tests/images/effect_spread.png b/Tests/images/effect_spread.png new file mode 100644 index 000000000..df7cfa474 Binary files /dev/null and b/Tests/images/effect_spread.png differ diff --git a/Tests/test_image.py b/Tests/test_image.py index 77baf4fe7..00fbc438a 100644 --- a/Tests/test_image.py +++ b/Tests/test_image.py @@ -152,7 +152,7 @@ class TestImage(PillowTestCase): # Assert self.assertEqual(im.size, (512, 512)) - im2 = Image.open('Tests/images/mandelbrot.png') + im2 = Image.open('Tests/images/effect_mandelbrot.png') self.assert_image_equal(im, im2) @unittest.skipUnless(sys.platform.startswith('win32'), @@ -170,6 +170,19 @@ class TestImage(PillowTestCase): self.assertEqual(im.getpixel((0, 0)), 60) self.assertEqual(im.getpixel((0, 1)), 28) + def test_effect_spread(self): + # Arrange + im = lena() + distance = 10 + + # Act + im2 = im.effect_spread(distance) + + # Assert + self.assertEqual(im.size, (128, 128)) + im3 = Image.open('Tests/images/effect_spread.png') + self.assert_image_equal(im2, im3) + if __name__ == '__main__': unittest.main() diff --git a/libImaging/Effects.c b/libImaging/Effects.c index 2ebd9f880..32fed6ddd 100644 --- a/libImaging/Effects.c +++ b/libImaging/Effects.c @@ -124,11 +124,11 @@ ImagingEffectSpread(Imaging imIn, int distance) imOut = ImagingNew(imIn->mode, imIn->xsize, imIn->ysize); if (!imOut) - return NULL; + return NULL; -#define SPREAD(type, image)\ +#define SPREAD(type, image)\ for (y = 0; y < imIn->ysize; y++)\ - for (x = 0; x < imIn->xsize; x++) {\ + for (x = 0; x < imIn->xsize; x++) {\ int xx = x + (rand() % distance) - distance/2;\ int yy = y + (rand() % distance) - distance/2;\ if (xx >= 0 && xx < imIn->xsize && yy >= 0 && yy < imIn->ysize) {\ @@ -139,9 +139,9 @@ ImagingEffectSpread(Imaging imIn, int distance) } if (imIn->image8) { - SPREAD(UINT8, image8); + SPREAD(UINT8, image8); } else { - SPREAD(INT32, image32); + SPREAD(INT32, image32); } ImagingCopyInfo(imOut, imIn);