7

Я хочу, чтобы нарисовать прямоугольник и текст в ней, вот часть моего кода, и это немного запутанным:Нарисуйте прямоугольник и текст в ней, используя PIL

from PIL import Image 
from PIL import ImageFont 
from PIL import ImageDraw 
from PIL import ImageEnhance 

    source_img = Image.open(file_name).convert("RGB") 

    img1 = Image.new("RGBA", img.size, (0,0,0,0)) 
    draw1 = ImageDraw.Draw(watermark, "RGBA") 
    draw1.rectangle(((0, 00), (100, 100)), fill="black") 
    img_rectangle = Image.composite(img1, source_img, img1) 

    draw2 = ImageDraw.Draw(img1, "RGBA") 
    draw2.text((20, 70), "something123", font=ImageFont.truetype("font_path123")) 

    Image.composite(img1, source_img, img1).save(out_file, "JPEG") 

Это привлекает их обоих, но они разделены: текст находится под прямоугольником. В то время как я хочу, чтобы текст рисовался внутри прямоугольника. Как я могу это сделать? Должен ли я обязательно их составить или что?

+1

Вы не можете сделать это одним изображением - draw1? – furas

+0

@furas, могу я ?. – ako25

ответ

12

Вы можете сделать это без composite()

from PIL import Image, ImageFont, ImageDraw, ImageEnhance 

source_img = Image.open(file_name).convert("RGBA") 

draw = ImageDraw.Draw(source_img) 
draw.rectangle(((0, 00), (100, 100)), fill="black") 
draw.text((20, 70), "something123", font=ImageFont.truetype("font_path123")) 

source_img.save(out_file, "JPEG") 

Вы можете создать пустой файл с размером кнопки и вводить текст на нем, а затем поместить этот файл на source_img. Таким образом, длинный текст будет уменьшен до размера кнопки.

from PIL import Image, ImageFont, ImageDraw, ImageEnhance 

source_img = Image.open("source.jpg").convert("RGBA") 

# create image with size (100,100) and black background 
button_img = Image.new('RGBA', (100,100), "black") 

# put text on image 
button_draw = ImageDraw.Draw(button_img) 
button_draw.text((20, 70), "very loooooooooooooooooong text", font=ImageFont.truetype("arial")) 

# put button on source image in position (0, 0) 
source_img.paste(button_img, (0, 0)) 

# save in new file 
source_img.save("output.jpg", "JPEG") 

EDIT: Я использую ImageFont.getsize(text), чтобы получить размер текста и кнопку создать с правильным размером.

from PIL import Image, ImageFont, ImageDraw, ImageEnhance 

source_img = Image.open("input.jpg").convert("RGBA") 


font = ImageFont.truetype("arial") 

text = "very loooooooooooooooooong text" 

# get text size 
text_size = font.getsize(text) 

# set button size + 10px margins 
button_size = (text_size[0]+20, text_size[1]+20) 

# create image with correct size and black background 
button_img = Image.new('RGBA', button_size, "black") 

# put text on button with 10px margins 
button_draw = ImageDraw.Draw(button_img) 
button_draw.text((10, 10), text, font=font) 

# put button on source image in position (0, 0) 
source_img.paste(button_img, (0, 0)) 

# save in new file 
source_img.save("output.jpg", "JPEG") 
+0

не рисует текст внутри прямоугольника. – ako25

+0

это работает для меня - я получаю текст внутри прямоугольника. Возможно, вы проверяете неправильное изображение - удалите все старые изображения и снова запустите. – furas

+0

Нет, изображение верное. как он знает, что (20, 70) являются координатами внутри прямоугольника, а не внутри всего изображения? – ako25