mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-27 17:54:32 +03:00
Add access functions for ImagingEffectMandelbrot with a test
This commit is contained in:
parent
76ef83263b
commit
8c96d38ce9
14
PIL/Image.py
14
PIL/Image.py
|
@ -2424,9 +2424,21 @@ def _showxv(image, title=None, **options):
|
||||||
# --------------------------------------------------------------------
|
# --------------------------------------------------------------------
|
||||||
# Effects
|
# Effects
|
||||||
|
|
||||||
|
def effect_mandelbrot(size, extent, quality):
|
||||||
|
"""
|
||||||
|
Generate a Mandelbrot set covering the given extent.
|
||||||
|
|
||||||
|
:param size: The requested size in pixels, as a 2-tuple:
|
||||||
|
(width, height).
|
||||||
|
:param extent: The extent to cover, as a 4-tuple:
|
||||||
|
(x0, y0, x1, y2).
|
||||||
|
:param quality: Quality.
|
||||||
|
"""
|
||||||
|
return Image()._new(core.effect_mandelbrot(size, extent, quality))
|
||||||
|
|
||||||
def effect_noise(size, sigma):
|
def effect_noise(size, sigma):
|
||||||
"""
|
"""
|
||||||
Generate Gaussian noise centered around 128
|
Generate Gaussian noise centered around 128.
|
||||||
|
|
||||||
:param size: The requested size in pixels, as a 2-tuple:
|
:param size: The requested size in pixels, as a 2-tuple:
|
||||||
(width, height).
|
(width, height).
|
||||||
|
|
BIN
Tests/images/mandelbrot.png
Normal file
BIN
Tests/images/mandelbrot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
|
@ -141,6 +141,20 @@ class TestImage(PillowTestCase):
|
||||||
img_colors = sorted(img.getcolors())
|
img_colors = sorted(img.getcolors())
|
||||||
self.assertEqual(img_colors, expected_colors)
|
self.assertEqual(img_colors, expected_colors)
|
||||||
|
|
||||||
|
def test_effect_mandelbrot(self):
|
||||||
|
# Arrange
|
||||||
|
size = (512, 512)
|
||||||
|
extent = (-3, -2.5, 2, 2.5)
|
||||||
|
quality = 100
|
||||||
|
|
||||||
|
# Act
|
||||||
|
im = Image.effect_mandelbrot(size, extent, quality)
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
self.assertEqual(im.size, (512, 512))
|
||||||
|
im2 = Image.open('Tests/images/mandelbrot.png')
|
||||||
|
self.assert_image_equal(im, im2)
|
||||||
|
|
||||||
@unittest.skipUnless(sys.platform.startswith('win32'),
|
@unittest.skipUnless(sys.platform.startswith('win32'),
|
||||||
"Stalls on Travis CI, passes on Windows")
|
"Stalls on Travis CI, passes on Windows")
|
||||||
def test_effect_noise(self):
|
def test_effect_noise(self):
|
||||||
|
@ -156,7 +170,6 @@ class TestImage(PillowTestCase):
|
||||||
self.assertEqual(im.getpixel((0, 0)), 60)
|
self.assertEqual(im.getpixel((0, 0)), 60)
|
||||||
self.assertEqual(im.getpixel((0, 1)), 28)
|
self.assertEqual(im.getpixel((0, 1)), 28)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
||||||
|
|
|
@ -48,25 +48,25 @@ ImagingEffectMandelbrot(int xsize, int ysize, double extent[4], int quality)
|
||||||
|
|
||||||
for (y = 0; y < ysize; y++) {
|
for (y = 0; y < ysize; y++) {
|
||||||
UINT8* buf = im->image8[y];
|
UINT8* buf = im->image8[y];
|
||||||
for (x = 0; x < xsize; x++) {
|
for (x = 0; x < xsize; x++) {
|
||||||
x1 = y1 = xi2 = yi2 = 0.0;
|
x1 = y1 = xi2 = yi2 = 0.0;
|
||||||
cr = x*dr + extent[0];
|
cr = x*dr + extent[0];
|
||||||
ci = y*di + extent[1];
|
ci = y*di + extent[1];
|
||||||
for (k = 1;; k++) {
|
for (k = 1;; k++) {
|
||||||
y1 = 2*x1*y1 + ci;
|
y1 = 2*x1*y1 + ci;
|
||||||
x1 = xi2 - yi2 + cr;
|
x1 = xi2 - yi2 + cr;
|
||||||
xi2 = x1*x1;
|
xi2 = x1*x1;
|
||||||
yi2 = y1*y1;
|
yi2 = y1*y1;
|
||||||
if ((xi2 + yi2) > radius) {
|
if ((xi2 + yi2) > radius) {
|
||||||
buf[x] = k*255/quality;
|
buf[x] = k*255/quality;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (k > quality) {
|
if (k > quality) {
|
||||||
buf[x] = 0;
|
buf[x] = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return im;
|
return im;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user