PIL вставляет исходное изображение вместо обрезанного изображения - PullRequest
0 голосов
/ 25 ноября 2018

Я хотел бы получить помощь, почему Подушка не помещает обрезанное изображение, а не оригинал, когда я сохраняю изображение?Он отображается как обрезанный, когда я сохраняю его после обрезки, но когда я его вставляю, вместо него вставляется оригинал, даже после сохранения обрезанного и загрузки обрезанного изображения, а затем вставки.Вот мой код, чтобы воссоздать проблему:

import os
from PIL import Image, ImageDraw, ImageOps, ImageFont, ImageFilter

filename = "image to crop.png"
offset = 50,50
size = 400,400
avatar = Image.open(filename)
avatar = avatar.resize(size, Image.ANTIALIAS)
rad = 200
circle = Image.new('L', (rad * 2, rad * 2), 0)
draw = ImageDraw.Draw(circle)
draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
alpha = Image.new('L', _avatar.size, "white")
w, h = _avatar.size
alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
alpha = alpha.resize(size)
avatar.putalpha(alpha)
background = Image.open("image to paste to.png")
background.paste(avatar, offset)
background.save("image with cropped image pasted.png")

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Итак, я нашел решение!проблема была в том, что я не назначил маску при вставке!вот код, который это исправил:

mask = Image.new("L", size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0) + size, fill=255)
avatar = ImageOps.fit(avatar, mask.size, centering=(0.5, 0.5))
avatar.putalpha(mask)
background = Image.open("welcomecardbackground.jpg")
background.paste(avatar, offset, mask)

вместо

circle = Image.new('L', (rad * 2, rad * 2), 0)
draw = ImageDraw.Draw(circle)
draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
alpha = Image.new('L', _avatar.size, "white")
w, h = _avatar.size
alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
alpha = alpha.resize(size)
avatar.putalpha(alpha)
0 голосов
/ 25 ноября 2018

В строке 444 вы не назначаете вывод изменения размера.resize возвращает новое изображение, оно не изменяет исходное изображение.

...