mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-03 13:14:27 +03:00
Improve efficiency when a radius is zero
This commit is contained in:
parent
c167d7a269
commit
9f54a11a9c
|
@ -23,6 +23,7 @@ from .helper import assert_image_equal, hopper
|
||||||
ImageFilter.MinFilter,
|
ImageFilter.MinFilter,
|
||||||
ImageFilter.ModeFilter,
|
ImageFilter.ModeFilter,
|
||||||
ImageFilter.GaussianBlur,
|
ImageFilter.GaussianBlur,
|
||||||
|
ImageFilter.GaussianBlur(0),
|
||||||
ImageFilter.GaussianBlur(5),
|
ImageFilter.GaussianBlur(5),
|
||||||
ImageFilter.GaussianBlur((2, 5)),
|
ImageFilter.GaussianBlur((2, 5)),
|
||||||
ImageFilter.BoxBlur(0),
|
ImageFilter.BoxBlur(0),
|
||||||
|
|
|
@ -170,6 +170,8 @@ class GaussianBlur(MultibandFilter):
|
||||||
xy = self.radius
|
xy = self.radius
|
||||||
if not isinstance(xy, (tuple, list)):
|
if not isinstance(xy, (tuple, list)):
|
||||||
xy = (xy, xy)
|
xy = (xy, xy)
|
||||||
|
if xy == (0, 0):
|
||||||
|
return image.copy()
|
||||||
return image.gaussian_blur(xy)
|
return image.gaussian_blur(xy)
|
||||||
|
|
||||||
|
|
||||||
|
@ -202,6 +204,8 @@ class BoxBlur(MultibandFilter):
|
||||||
xy = self.radius
|
xy = self.radius
|
||||||
if not isinstance(xy, (tuple, list)):
|
if not isinstance(xy, (tuple, list)):
|
||||||
xy = (xy, xy)
|
xy = (xy, xy)
|
||||||
|
if xy == (0, 0):
|
||||||
|
return image.copy()
|
||||||
return image.box_blur(xy)
|
return image.box_blur(xy)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -258,29 +258,39 @@ ImagingBoxBlur(Imaging imOut, Imaging imIn, float xradius, float yradius, int n)
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
}
|
}
|
||||||
|
|
||||||
imTransposed = ImagingNewDirty(imIn->mode, imIn->ysize, imIn->xsize);
|
|
||||||
if (!imTransposed) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Apply blur in one dimension.
|
/* Apply blur in one dimension.
|
||||||
Use imOut as a destination at first pass,
|
Use imOut as a destination at first pass,
|
||||||
then use imOut as a source too. */
|
then use imOut as a source too. */
|
||||||
ImagingHorizontalBoxBlur(imOut, imIn, xradius);
|
|
||||||
for (i = 1; i < n; i++) {
|
|
||||||
ImagingHorizontalBoxBlur(imOut, imOut, xradius);
|
|
||||||
}
|
|
||||||
/* Transpose result for blur in another direction. */
|
|
||||||
ImagingTranspose(imTransposed, imOut);
|
|
||||||
|
|
||||||
/* Reuse imTransposed as a source and destination there. */
|
if (xradius != 0) {
|
||||||
for (i = 0; i < n; i++) {
|
ImagingHorizontalBoxBlur(imOut, imIn, xradius);
|
||||||
ImagingHorizontalBoxBlur(imTransposed, imTransposed, yradius);
|
for (i = 1; i < n; i++) {
|
||||||
|
ImagingHorizontalBoxBlur(imOut, imOut, xradius);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Restore original orientation. */
|
if (yradius != 0) {
|
||||||
ImagingTranspose(imOut, imTransposed);
|
imTransposed = ImagingNewDirty(imIn->mode, imIn->ysize, imIn->xsize);
|
||||||
|
if (!imTransposed) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ImagingDelete(imTransposed);
|
/* Transpose result for blur in another direction. */
|
||||||
|
ImagingTranspose(imTransposed, xradius == 0 ? imIn : imOut);
|
||||||
|
|
||||||
|
/* Reuse imTransposed as a source and destination there. */
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
ImagingHorizontalBoxBlur(imTransposed, imTransposed, yradius);
|
||||||
|
}
|
||||||
|
/* Restore original orientation. */
|
||||||
|
ImagingTranspose(imOut, imTransposed);
|
||||||
|
|
||||||
|
ImagingDelete(imTransposed);
|
||||||
|
}
|
||||||
|
if (xradius == 0 && yradius == 0) {
|
||||||
|
if (!ImagingCopy2(imOut, imIn)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return imOut;
|
return imOut;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user