У меня есть папка с изображениями, и я хочу обрезать их по кругу. Это исходное изображение: Результат, которого я хочу, таков: Мой код: import os import glob from PIL import Image, ImageDraw, ...

1
amiroruji72 16 Дек 2020 в 01:59

1 ответ

Лучший ответ

Я не уверен, действительно ли вам нужно использовать numpy для загрузки файлов, но вы можете сделать то, что указано в «Пример кода для пакетной обработки» страницы, которой вы поделились:

import os
import glob
from PIL import Image, ImageDraw, ImageFilter


def mask_circle_solid(pil_img, background_color, blur_radius, offset=0):
    background = Image.new(pil_img.mode, pil_img.size, background_color)

    offset = blur_radius * 2 + offset
    mask = Image.new("L", pil_img.size, 0)
    draw = ImageDraw.Draw(mask)
    draw.ellipse((offset, offset, pil_img.size[0] - offset, pil_img.size[1] - offset), fill=255)
    mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))

    return Image.composite(pil_img, background, mask)


def mask_circle_transparent(pil_img, blur_radius, offset=0):
    offset = blur_radius * 2 + offset
    mask = Image.new("L", pil_img.size, 0)
    draw = ImageDraw.Draw(mask)
    draw.ellipse((offset, offset, pil_img.size[0] - offset, pil_img.size[1] - offset), fill=255)
    mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))

    result = pil_img.copy()
    result.putalpha(mask)

    return result


def crop_max_square(pil_img):
    return crop_center(pil_img, min(pil_img.size), min(pil_img.size))


def crop_center(pil_img, crop_width, crop_height):
    img_width, img_height = pil_img.size
    return pil_img.crop(((img_width - crop_width) // 2,
                         (img_height - crop_height) // 2,
                         (img_width + crop_width) // 2,
                         (img_height + crop_height) // 2))


im = []
jpgs_files_path = "./" # Replace the "./" path by the path where the .jpg images are.
files = glob.glob(os.path.join(jpgs_files_path, '*.jpg')) 
thumb_width = 150

for f in files:
    im = Image.open(f)
    im_thumb = crop_max_square(im).resize((thumb_width, thumb_width), Image.LANCZOS)
    im_thumb = mask_circle_transparent(im_thumb, 4)
    ftitle, fext = os.path.splitext(os.path.basename(f))
    im_thumb.save(os.path.join("./dstdir/", ftitle + '_thumbnail.png'), quality=95)

Поскольку JPG не поддерживает прозрачность, вам необходимо отказаться от альфа-канала или сохранить его как нечто, поддерживающее прозрачность, например PNG.

1
Lucas Belfanti 2 Янв 2021 в 20:25