globalforest/kivymd/utils/cropimage.py
2020-10-14 07:19:43 +03:00

118 lines
3 KiB
Python
Executable file

"""
Crop Image
==========
"""
def crop_image(
cutting_size,
path_to_image,
path_to_save_crop_image,
corner=0,
blur=0,
corner_mode="all",
):
"""Call functions of cropping/blurring/rounding image.
cutting_size: size to which the image will be cropped;
path_to_image: path to origin image;
path_to_save_crop_image: path to new image;
corner: value of rounding corners;
blur: blur value;
corner_mode: 'all'/'top'/'bottom' - indicates which corners to round out;
"""
im = _crop_image(cutting_size, path_to_image, path_to_save_crop_image)
if corner:
im = add_corners(im, corner, corner_mode)
if blur:
im = add_blur(im, blur)
try:
im.save(path_to_save_crop_image)
except IOError:
im.save(path_to_save_crop_image, "JPEG")
def add_blur(im, mode):
from PIL import ImageFilter
im = im.filter(ImageFilter.GaussianBlur(mode))
return im
def _crop_image(cutting_size, path_to_image, path_to_save_crop_image):
from PIL import Image, ImageOps
image = Image.open(path_to_image)
image = ImageOps.fit(image, cutting_size)
image.save(path_to_save_crop_image)
return image
def add_corners(im, corner, corner_mode):
def add_top_corners():
alpha.paste(circle.crop((0, 0, corner, corner)), (0, 0))
alpha.paste(
circle.crop((corner, 0, corner * 2, corner)), (w - corner, 0)
)
def add_bottom_corners():
alpha.paste(
circle.crop((0, corner, corner, corner * 2)), (0, h - corner)
)
alpha.paste(
circle.crop((corner, corner, corner * 2, corner * 2)),
(w - corner, h - corner),
)
from PIL import Image, ImageDraw
circle = Image.new("L", (corner * 2, corner * 2), 0)
draw = ImageDraw.Draw(circle)
draw.ellipse((0, 0, corner * 2, corner * 2), fill=255)
alpha = Image.new("L", im.size, 255)
w, h = im.size
if corner_mode == "all":
add_top_corners()
add_bottom_corners()
elif corner_mode == "top":
add_top_corners()
if corner_mode == "bottom":
add_bottom_corners()
im.putalpha(alpha)
return im
def prepare_mask(size, antialias=2):
from PIL import Image, ImageDraw
mask = Image.new("L", (size[0] * antialias, size[1] * antialias), 0)
ImageDraw.Draw(mask).ellipse((0, 0) + mask.size, fill=255)
return mask.resize(size, Image.ANTIALIAS)
def _crop_round_image(im, s):
from PIL import Image
w, h = im.size
k = w // s[0] - h // s[1]
if k > 0:
im = im.crop(((w - h) // 2, 0, (w + h) // 2, h))
elif k < 0:
im = im.crop((0, (h - w) // 2, w, (h + w) // 2))
return im.resize(s, Image.ANTIALIAS)
def crop_round_image(cutting_size, path_to_image, path_to_new_image):
from PIL import Image
im = Image.open(path_to_image)
im = _crop_round_image(im, cutting_size)
im.putalpha(prepare_mask(cutting_size, 4))
im.save(path_to_new_image)