Rendering Equations with ImageMagick’s Convert

| | 6 Comments | 1 TrackBack

Last October I described my algorithm for rendering LaTeX equations for use on this blog: “Rendering Equations in Movable Type”. For kicks, here are instructions on how to manually run the algorithm. The only thing missing is the middle alignment part of the algorithm.

First create a file, called eqn.tex using the following skeleton. Insert your LaTeX equation code where it says to.


Next process the file with pdflatex eqn.tex, which will render your equation as eqn.pdf. Now we will use the convert command line tool from the ImageMagick library to turn eqn.pdf into eqn.png.

convert \( -density $DENSITY eqn.pdf -trim +repage \) \
   \( +clone -fuzz 100% -fill $FG -opaque black \) \
   +swap -compose copy-opacity -composite \
   \( +clone -fuzz 100% -fill white -opaque $BG +matte \) \
    +swap -compose over -composite eqn.png

Here DENSITY, FG, and BG are user tunable variables. DENSITY tells convert how many pixels per inch to use when rendering the pdf to a png. This determines how big of a png you have for a given rendered equation. Note that a density of 300 is print quality, 96 is windows monitor standard, and 72 is the mac standard. FG is the color of the equation text in the final image, and BG is the color of the background. Setting BG to none will make the background transparent.

Now for an explanation of the options:

\( -density $DENSITY eqn.pdf -trim +repage \) \ loads the pdf into memore, removes excess background, and saves it into the image stack position 0.

\( +clone -fuzz 100% -fill $FG -opaque black \) \ copies the image at position 0, fills it with the FG color, and saves it at position 1. We clone and fill to ensure that image 1 has the same dimensions as the trimmed image in position 0.

+swap -compose copy-opacity -composite \ uses the black-and-white values in position 0 to determine how transparent pixels are in 1, clears the stack, and saves the result to pos 0. We actually swap positions 0 and 1 to put them in the right order for the -composite operator.

\( +clone -fuzz 100% -fill white -opaque $BG +matte \) \ copies image 0 again and fills it with the BG color, discarding all transparency information.

+swap -compose over -composite eqn.png overlays image 0 onto image 1 and saves result to eqn.png.

And now you have an equation rendered as a png that can be included on any webpage.

1 TrackBack

Blogotechnospherics from Greg Laden's Blog on March 2, 2008 8:29 PM

Reed Cartwright has two neat current posts that may be of interest to the blog nerd. One is on how to render equations with Imagemagick. This technique uses LaTeX to start with and ends up with a picture you can put on a blog post.... Read More


When I upgraded ImageMagick from 6.3 to 6.4, your handy convert script stopped working. After some tinkering, this version arose from the ashes to wreak equations upon the HTML pages:

convert \( -density $DENSITY eqn.pdf -trim +repage \) \ \( -clone 0 -negate -background $FG -channel A -combine \) \ \( -clone 0 -background $BG -channel A -combine \) \ -delete 0 -compose dst-over -composite eqn.png

Just trying to give a little back.

Blessings, TwP

You’ll have to filter out the extraneous backslashes from the above snippet of command line goodness. The original was broken across four lines, and the comment formatting swallowed the newlines [sigh].


Tim’s solution reformatted:

convert \( -density $DENSITY eqn.pdf -trim +repage \) \
\( -clone 0 -negate -background $FG -channel A -combine \) \
\( -clone 0 -background $BG -channel A -combine \) \
-delete 0 -compose dst-over -composite eqn.png

For black text on white backgrounds this solution works as well:

convert \( -density $DENSITY eqn.pdf -trim +repage \) \
\( -clone 0 -fill $BG -colorize 100% \) \ 
\( -clone 0 -background $FG -channel A -combine \) \
-delete 0 -compose over -composite eqn.png

It’s a modified version of Tim’s solution.

forgive me for being clueless, but how do I modify the values of $DENSITY, $FG, and $BG? (so that I can use this command more generically) I think it was something like commandHere $YOURVAR=:value, but I can’t get it to work.

I’d like to use this to generate black text on a transparent background but I’m a bit lost. I tried man convert and my head nearly exploded. Powerful, but would take a bit of time to figure out.

current command: convert \( -density 100 KCL_eqns_1.pdf -trim +repage \) \( -clone 0 -fill black -colorize 100% \) \( -clone 0 -background white -channel A -combine \) -delete 0 -compose over -composite eqn.png

this puts out a png with black text and white background.

I’ve been spending all night trying to get a latex png for a question on a forum. I love how linux can send you off on unending tangents such as this one. :P

Just set them as environmental variables. If you use Bash, you can do:

DENSITY=100 convert …

Windows has its on ways to set and retrieve environmental variables.

About this Entry

This page contains a single entry by Reed A. Cartwright published on February 28, 2008 12:46 PM.

Estimating Local Ancestry was the previous entry in this blog.

Sifakas, Ringtaileds, and Sportives, Aye-Aye! is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.


Powered by Movable Type 4.37