10

I need to put some text over a PNG image in Python, I need to put another image too over the first one.

So I'll have a base image (the same for every image created), a logo to put over it in the upper left corner, and a text all over the image (non-specific font, I just need to set the font size).

Could I use PIL, or another Library?

I searched over StackOverflow and Google too, but I could not find tips on how to do this.

Thanks.

Paul D. Waite
  • 96,640
  • 56
  • 199
  • 270
redmarv
  • 117
  • 1
  • 2
  • 7

3 Answers3

21

PIL can do it:

from PIL import Image, ImageFont, 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)
img.save("a_test.png")

The only error that can occur is not to find the font. In this case you must change the code line:

font = ImageFont.truetype("/usr/share/fonts/dejavu/DejaVuSans.ttf",25)

Source: http://python-catalin.blogspot.com/2010/06/add-text-on-image-with-pil-module.html

Avi Flax
  • 50,872
  • 9
  • 47
  • 64
Lou Franco
  • 87,846
  • 14
  • 132
  • 192
9

I think opencv is easier to use:

import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread('xxx.png')  
texted_image =cv2.putText(img=np.copy(image), text="hello", org=(200,200),fontFace=3, fontScale=3, color=(0,0,255), thickness=5)
plt.imshow(texted_image)
plt.show()

Note that the original image may be changed, so I add np.copy to protect it. More details on the function is http://docs.opencv.org/2.4.8/modules/core/doc/drawing_functions.html?highlight=puttext#cv2.putText

The fontFace can be referred to https://codeyarns.com/2015/03/11/fonts-in-opencv/

Yuchao Jiang
  • 3,522
  • 30
  • 23
1

PIL is one approach. You might also look at ImageMagick, which also supports compositing images and putting text into images (and lots of other stuff).

There's a python interface to ImageMagick through PythonMagick.

bgporter
  • 35,114
  • 8
  • 59
  • 65