Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Draw a rectangle and a text in it using PIL

I want to draw a rectangle and a text in it, here's a part of my code and it's a bit obfuscated:

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") 

This draws them both, but they're separate: the text is under the rectangle. Whereas I want a text to be drawn inside the rectangle. How can I do that? Should I necessarily compose them or what?

like image 769
ako25 Avatar asked Dec 31 '16 05:12

ako25


People also ask

How do you draw a rectangle using PIL?

rectangle() Draws an rectangle. Parameters: xy – Four points to define the bounding box. Sequence of either [(x0, y0), (x1, y1)] or [x0, y0, x1, y1].

How can I draw rectangle in Python?

We can create a simple rectangle by defining a function that takes in two integers representing side length and side height. Then we can loop four times, using the forward() function to create a side representing either the length or height, then rotating the cursor 90 degrees with the right() function.

How do you draw a rectangle in cv2?

Step 1: Import cv2. Step 2: Read the image using imread(). Step 3: Define the starting coordinates. Step 5: Define the ending coordinates.


1 Answers

You can do it without 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") 

You can create empty image with size of button and put text on it and later put this image on source_img. This way long text will be cut to size of button.

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: I use ImageFont.getsize(text) to get text size and create button with correct size.

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") 
like image 152
furas Avatar answered Sep 30 '22 14:09

furas