2016-12-31 134 views
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") 

编辑:我用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