mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-26 09:14:27 +03:00
add effective_scale to all APIs
This commit is contained in:
parent
091b15f9d5
commit
84b9f16bfd
|
@ -149,11 +149,12 @@ class GaussianBlur(Filter):
|
||||||
"""
|
"""
|
||||||
name = "GaussianBlur"
|
name = "GaussianBlur"
|
||||||
|
|
||||||
def __init__(self, radius=2):
|
def __init__(self, radius=2, effective_scale=None):
|
||||||
self.radius = radius
|
self.radius = radius
|
||||||
|
self.effective_scale = effective_scale
|
||||||
|
|
||||||
def filter(self, image):
|
def filter(self, image):
|
||||||
return image.gaussian_blur(self.radius)
|
return image.gaussian_blur(self.radius, self.effective_scale)
|
||||||
|
|
||||||
|
|
||||||
class UnsharpMask(Filter):
|
class UnsharpMask(Filter):
|
||||||
|
|
|
@ -413,15 +413,18 @@ def solarize(image, threshold=128):
|
||||||
# --------------------------------------------------------------------
|
# --------------------------------------------------------------------
|
||||||
# PIL USM components, from Kevin Cazabon.
|
# PIL USM components, from Kevin Cazabon.
|
||||||
|
|
||||||
def gaussian_blur(im, radius=None):
|
def gaussian_blur(im, radius=None, effective_scale=None):
|
||||||
""" PIL_usm.gblur(im, [radius])"""
|
""" PIL_usm.gblur(im, [radius], [effective_scale])"""
|
||||||
|
|
||||||
if radius is None:
|
if radius is None:
|
||||||
radius = 5.0
|
radius = 5.0
|
||||||
|
|
||||||
|
if effective_scale is None:
|
||||||
|
effective_scale = 2.6
|
||||||
|
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
return im.im.gaussian_blur(radius)
|
return im.im.gaussian_blur(radius, effective_scale)
|
||||||
|
|
||||||
gblur = gaussian_blur
|
gblur = gaussian_blur
|
||||||
|
|
||||||
|
|
|
@ -863,7 +863,8 @@ _gaussian_blur(ImagingObject* self, PyObject* args)
|
||||||
Imaging imOut;
|
Imaging imOut;
|
||||||
|
|
||||||
float radius = 0;
|
float radius = 0;
|
||||||
if (!PyArg_ParseTuple(args, "f", &radius))
|
float effectiveScale = 2.6;
|
||||||
|
if (!PyArg_ParseTuple(args, "f|f", &radius, &effectiveScale))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
imIn = self->image;
|
imIn = self->image;
|
||||||
|
@ -871,7 +872,7 @@ _gaussian_blur(ImagingObject* self, PyObject* args)
|
||||||
if (!imOut)
|
if (!imOut)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!ImagingGaussianBlur(imIn, imOut, radius))
|
if (!ImagingGaussianBlur(imIn, imOut, radius, effectiveScale))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return PyImagingNew(imOut);
|
return PyImagingNew(imOut);
|
||||||
|
|
|
@ -263,7 +263,8 @@ extern Imaging ImagingFilter(
|
||||||
FLOAT32 offset, FLOAT32 divisor);
|
FLOAT32 offset, FLOAT32 divisor);
|
||||||
extern Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn);
|
extern Imaging ImagingFlipLeftRight(Imaging imOut, Imaging imIn);
|
||||||
extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn);
|
extern Imaging ImagingFlipTopBottom(Imaging imOut, Imaging imIn);
|
||||||
extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius);
|
extern Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius,
|
||||||
|
float effectiveScale);
|
||||||
extern Imaging ImagingGetBand(Imaging im, int band);
|
extern Imaging ImagingGetBand(Imaging im, int band);
|
||||||
extern int ImagingGetBBox(Imaging im, int bbox[4]);
|
extern int ImagingGetBBox(Imaging im, int bbox[4]);
|
||||||
typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem;
|
typedef struct { int x, y; INT32 count; INT32 pixel; } ImagingColorItem;
|
||||||
|
|
|
@ -20,7 +20,7 @@ static inline UINT8 clip(double in)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Imaging
|
static Imaging
|
||||||
gblur(Imaging im, Imaging imOut, float radius, int channels)
|
gblur(Imaging im, Imaging imOut, float radius, float effectiveScale, int channels)
|
||||||
{
|
{
|
||||||
ImagingSectionCookie cookie;
|
ImagingSectionCookie cookie;
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ gblur(Imaging im, Imaging imOut, float radius, int channels)
|
||||||
|
|
||||||
/* Only pixels in effective radius from source pixel are accounted.
|
/* Only pixels in effective radius from source pixel are accounted.
|
||||||
The Gaussian values outside 3 x radius is near zero. */
|
The Gaussian values outside 3 x radius is near zero. */
|
||||||
effectiveRadius = (int) ceil(radius * 2.57);
|
effectiveRadius = (int) ceil(radius * effectiveScale);
|
||||||
/* Window is number of pixels forming the result pixel on one axis.
|
/* Window is number of pixels forming the result pixel on one axis.
|
||||||
It is source pixel and effective radius in both directions. */
|
It is source pixel and effective radius in both directions. */
|
||||||
window = effectiveRadius * 2 + 1;
|
window = effectiveRadius * 2 + 1;
|
||||||
|
@ -197,7 +197,8 @@ gblur(Imaging im, Imaging imOut, float radius, int channels)
|
||||||
return imOut;
|
return imOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius)
|
Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius,
|
||||||
|
float effectiveScale)
|
||||||
{
|
{
|
||||||
int channels = 0;
|
int channels = 0;
|
||||||
|
|
||||||
|
@ -214,7 +215,7 @@ Imaging ImagingGaussianBlur(Imaging im, Imaging imOut, float radius)
|
||||||
} else
|
} else
|
||||||
return ImagingError_ModeError();
|
return ImagingError_ModeError();
|
||||||
|
|
||||||
return gblur(im, imOut, radius, channels);
|
return gblur(im, imOut, radius, effectiveScale, channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
Imaging
|
Imaging
|
||||||
|
@ -255,7 +256,7 @@ ImagingUnsharpMask(Imaging im, Imaging imOut, float radius, int percent,
|
||||||
|
|
||||||
/* first, do a gaussian blur on the image, putting results in imOut
|
/* first, do a gaussian blur on the image, putting results in imOut
|
||||||
temporarily */
|
temporarily */
|
||||||
result = gblur(im, imOut, radius, channels);
|
result = gblur(im, imOut, radius, 2.6, channels);
|
||||||
if (!result)
|
if (!result)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user