VMD-L Mailing List
From: M Karim (mahyar.karimi20_at_gmail.com)
Date: Thu Sep 25 2014 - 18:38:45 CDT
That's a useful topic. It can be used to show the (increasing/decreasing)
temperature on the movie frames.
On Fri, Sep 26, 2014 at 2:29 AM, Josh Vermaas <vermaas2_at_illinois.edu> wrote:
> Hi Thomas,
> For these kinds of things, I tend to prefer outputting the frames
> individually, editing the frames with a python script to insert the text
> (that way I can use prettier fonts for the labels), and stitching the
> frames together with ffmpeg. If you want to use VMD, you'll need to use the
> graphics commands to write arbitrary text (
> http://www.ks.uiuc.edu/Research/vmd/current/ug/node128.html). To control
> it on a frame by frame basis, you'd need to make a user-defined movie
> script (see
> for an example) and use that as your controller program for making the
> movie itself. I've done both methods, and I GREATLY prefer option #1.
> -Josh Vermaas
> Here is my example of adding text using python. I had many frames (all
> called frameXXXX.png), and wanted to sequentially go through them and label
> them according to how far along they were in the trajectory (between 0 and
> 300 ns). It requires the python image library (PIL), but to me this was
> alot less work than working out the TCL to get it right.
> #!/usr/bin/env python
> from PIL import Image
> from PIL import ImageFont
> from PIL import ImageDraw
> import math
> import numpy as np
> import glob
> font =
> fixedpoint = (183,13)
> point = "."
> nstext = "ns"
> images = sorted(glob.glob("frame*png"))
> for i, ns in enumerate(np.linspace(0,300,len(images))):
> print ns
> img = Image.open(images[i])
> draw = ImageDraw.Draw(img)
> tenths = "%1d" % ((10*ns % 10))
> ones = "%d" % math.floor(ns)
> w1, h1 = draw.textsize(ones, font=font)
> w2, h2 = draw.textsize(point, font=font)
> w3, h3 = draw.textsize(tenths, font=font)
> #No way of getting a thin-space (PIL doesn't believe in letting
> LaTeX do the typesetting). Do it by drawing two things close together
> draw.text((fixedpoint -w2 - w1,fixedpoint),"%s" %
> ones,(0,0,0), font=font)
> draw.text((fixedpoint -w2,fixedpoint),"%s" % point,(0,0,0),
> draw.text((fixedpoint ,fixedpoint),"%s" % tenths,(0,0,0),
> draw.text((fixedpoint+48,fixedpoint),"%s" % nstext,(0,0,0),
> img.save("images%04d.png" % i)
> On 09/25/2014 10:28 AM, Thomas Sexton wrote:
> I have been using VMD to make movies of chemical reactions for a
> presentation, and it has been very useful. Now, I would like to place a
> title at the top of the movie, where the text displayed depends on the
> frame. For example, I would like the label to say, "Before Transition
> State" or "After Transition State" depending on the frame number. I
> already know how to use the GUI to place bond length and angle labels, but
> it seems that these labels can't be used to write a title.
> I think that I need to know two things:
> 1) How do I display arbitrary text in an arbitrary location?
> 2) How do I change the displayed text based on frame number?
> Thanks for the great software,
> Thomas Sexton