Как изменить непрозрачность прямоугольника в PIL? - PullRequest
3 голосов
/ 21 апреля 2020

Я пытаюсь добиться чего-то похожего на изображение ниже, с полупрозрачным черным ящиком с надписью: Желаемый

Игнорировать тот факт, что это разные изображения, но я хочу добиться эффекта полупрозрачного прямоугольника, как на изображении выше. Код, который у меня сейчас есть:

from PIL import Image, ImageDraw

img = Image.new('RGBA', (512, 512), (255, 0, 0, 0))
draw = ImageDraw.Draw(img, 'RGBA')
shape = [(0, 512), (512, 308)]
draw.rectangle(shape, fill = 'black')

img.save('foo.png')


img2 = Image.open('final2.png')


Image.alpha_composite(img2, img).save('foo3.png')

Это дает следующий вывод:

Вывод (игнорировать белую рамку - это просто грубый скриншот)

Я пробовал путальфу, но она делает серый прямоугольник серым и все еще непрозрачным. Кроме того, я попытался создать прозрачное изображение того же размера, что и изображение, на котором я хочу нарисовать прямоугольник (512x512), а затем нарисовать прямоугольник в нижней части этого прозрачного изображения, а затем использовать смешивание, но цвета изображения запутались из-за белого изображения, смешанного сверху.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Все еще нужна помощь!

1 Ответ

1 голос
/ 23 апреля 2020

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

enter image description here

Затем я переписал ваш код следующим образом:

#!/usr/bin/env python3

from PIL import Image, ImageDraw

# Create new solid red background
h, w = 400, 600
bg = Image.new('RGB', (w, h), (255, 0, 0))

# Create copy and make bottom part black
dark = bg.copy()
draw  = ImageDraw.Draw(dark)
draw.rectangle((0, int(0.7*h), w, h), 0)
dark.save('dark.png')   # DEBUG

# Blend darkened copy over top of background
blended = Image.blend(bg, dark, 0.8) 
blended.save('blended.png')   # DEBUG

# Load text overlay with transparent background, paste on top and save
overlay = Image.open('text.png').convert('RGBA')
blended.paste(overlay, mask=overlay)
blended.save('result.png')

Что дает этот результат:

enter image description here

...