3

I am trying to create an image with some text in python like:

import PIL
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
font = ImageFont.truetype("/usr/share/fonts/dejavu/DejaVuSans.ttf",25)
img=Image.new("RGBA", (200,200),(120,20,20))
draw = ImageDraw.Draw(img)
draw.text((0, 0),"This is a test",(255,255,0),font=font)
draw = ImageDraw.Draw(img)
img.save("test.png")

This works fine, although, I was unable to add more colors, for instance 3 different colors RED,YELLOW, GREEN that will be like a semaphore.

Also, can the image be transformed, for instance round the corners?

Many thanks

Alg_D
  • 2,242
  • 6
  • 31
  • 63
  • Probable duplicate of [this question](http://stackoverflow.com/questions/7787375/python-imaging-library-pil-drawing-rounded-rectangle-with-gradient) – Jonathan Eunice Oct 11 '14 at 00:40
  • @Jonathan Eunice, This is definitely useful, but the change I needed in the above example should not require more than 3 or 4 lines. Something like add/draw another rectangle on the Image, just with another color. for the corners, one ellipse would probably do the job :) – Alg_D Oct 11 '14 at 00:57

1 Answers1

4

You can use the chord call at the ImageDraw.Draw class. You must pass this function four parameters, first one is position and size, described as an enclosing box, i.e. (x1, y1, x2, y2), second one is the start angle and the third one is the end angle; if you want a full circle you must specify 0 and 360, respectively. You can set the fill colour with a named parameter fill.

Better explained with an example:

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

font = ImageFont.truetype("/usr/share/fonts/truetype/DejaVuSans.ttf",25)
img=Image.new("RGBA", (200,200),(120,20,20))
draw = ImageDraw.Draw(img)
draw.text((0, 0),"This is a test",(255,255,0),font=font)
draw.chord((100, 75, 125, 100), 0, 360, fill='green')
draw.chord((75, 100, 100, 125), 0, 360, fill='blue')
draw.chord((125, 125, 150, 150), 0, 360, fill='yellow')
draw = ImageDraw.Draw(img)

img.save("test.png")
Euribates
  • 520
  • 5
  • 10
  • I used colours green, blue and yellow instead of red, yellow, green because of the red background. It's easy to change this. – Euribates Feb 11 '15 at 13:00
  • 1
    If you want to draw a semaphore, maybe you can use a predefined imaged as a base, instead of creating a new image. You can do this using the method `load` from `PIL.Image`. – Euribates Feb 11 '15 at 13:05
  • 1
    Also, the last call before the save operation is unnecesary: draw = ImageDraw.Draw(img) – Euribates Feb 11 '15 at 13:06