Skip to content Skip to sidebar Skip to footer

PIL - How To Insert An Index, Or Subscript, Into Text?

Like this: Calculating coordinates looks not so good, maybe there is a better way? This code works fine (), but it's complicated always calculate where to place index for each let

Solution 1:

One possibility for you might be to use ImageMagick which understands Pango Markup Language - which looks kind of like HTML.

So, at the command-line you could run this:

convert -background white pango:'<span size="49152">Formula: <b>2P<sub><small><small>2</small></small></sub>O<sub><small><small>5</small></small></sub></b></span>' formula.png

which produces this PNG file:

enter image description here

Change to -background none to write on a piece of transparent canvas if you want to preserve whatever is underneath the text in your original image.

You can also put all the markup in a separate text file, called say "pango.txt" like this:

<span size="49152">Formula: <b>2P<sub><small><small>2</small></small></sub>O<sub><small><small>5</small></small></sub></b></span>

and pass that into ImageMagick like this:

convert pango:@pango.txt result.png 

You could shell out and do this using:

subprocess.call()

Then you can easily load the resultant image and composite/paste it in where you want it - that would take about 3 lines of Python that you could put in a function.


Here is a further example of an image generated with Pango by Anthony Thyssen so you can see some of the possibilities:

enter image description here

There is loads of further information on Pango by Anthony here.


Note that there are also Python bindings for ImageMagick but I am not very familiar with them, but that may be cleaner than shelling out.

Keywords: Pango, PIL, Pillow, Python, markup, subscript, superscript, formula, chemical formulae, ImageMagick, image, image processing, SGML, HTML.


Solution 2:

You can also do this sort of thing using Mathtext in Matplotlib:

#!/usr/bin/env python3

import matplotlib.pyplot as plt

plt.axes([0.025, 0.025, 0.95, 0.95])

# Some formula with superscripts, subscripts, square roots, fractions and integrals
eq    = r"$ 2P_2 O_5 + H^{2j}$"
size  = 50
x,y   = 0.5, 0.5
alpha = 1
params = {'mathtext.default': 'regular' }
plt.rcParams.update(params)
plt.text(x, y, eq, ha='center', va='center', color="#11557c", alpha=alpha,
         transform=plt.gca().transAxes, fontsize=size, clip_on=True)

# Suppress ticks
plt.xticks(())
plt.yticks(())

# Save on transparent background
plt.savefig('result.png', transparent=True)

enter image description here

You can also save the output in a memory buffer (without going to disk) and then use that in your PIL-based image processing.

Note that I have explicitly named and assigned all the parameters (x, y, size and alpha) so you can play with them and that makes the code look longer and more complicated than it actually is.

Keywords: Python, PIL, Pillow, maths, mathematical symbols, formula with superscripts, subscripts, square roots, fractions and integrals.


Post a Comment for "PIL - How To Insert An Index, Or Subscript, Into Text?"