################################################################################ # AddTime2VMDmovie.tcl # # A TCL script used to take a set of .ppm images renderred with VMD # ("Extensions" -> "Visualization" -> "Movie Maker"), add time, # and then output a .gif movie. # # Usage: # # Sample input file named "para.dat": # prefix image # Image file prefix # num 100 # Number of images # t0 0 # Start time # dt 1 # Time step # unit ns # Time unit # width 1200 # Image width in pixels # height 900 # Image height # HLabel 30 # Label height # ratio 50 # ratio for resizing input images in percentage # # Run with VMD: # vmd -dispdev text -e AddTime2VMDmovie.tcl # # Yinglong Miao "yinglong.miao@gmail.com" # # 2/25/2009 # ################################################################################ set remark "AddTime)"; \ puts "$remark --------------------------------" # read parameters set parafile para.dat; set fpara [open $parafile r]; \ puts "$remark Open file ${parafile} for reading parameters ..." set params {} set values {} while { [gets $fpara line] >= 0 } { lappend params [string tolower [lindex $line 0]] lappend values [lindex $line 1] } close $fpara for { set i 0} { $i < [llength $params] } { incr i } { if { [lindex $params $i] == "prefix" } { set prefix [lindex $values $i]; puts "$remark File prefix: $prefix" }; # if if { [lindex $params $i] == "num" } { set nf [lindex $values $i]; puts "$remark Number of images: $nf" }; # if if { [lindex $params $i] == "t0" } { set t0 [lindex $values $i]; puts "$remark Start time: $t0" }; # if if { [lindex $params $i] == "dt" } { set step [lindex $values $i]; puts "$remark Time step: $step" }; # if if { [lindex $params $i] == "unit" } { set unit [lindex $values $i]; puts "$remark Time unit: $unit" }; # if if { [lindex $params $i] == "width" } { set a [lindex $values $i]; puts "$remark Image width: $a" }; # if if { [lindex $params $i] == "height" } { set b [lindex $values $i]; puts "$remark Image height: $b" }; # if if { [lindex $params $i] == "hlabel" } { set hlabel [lindex $values $i]; puts "$remark Label height: $hlabel" }; # if if { [lindex $params $i] == "ratio" } { set r [lindex $values $i]; puts "$remark Ratio for resizing PPM images in percentage: $r" }; # if }; # for set logfile vmd.log; puts "$remark logfile: $logfile" set t {} for {set i 0} {$i < $nf} {incr i} { lappend t "time: [format %8.3f [expr $t0+$i*$step]] $unit" } set ar [expr $a*$r/100]; # ---------------------------------------------------------- # set script control parameters set ConvertPPM2JPG 1; set AddLabel 1; set jpgs2gif 1; # ---------------------------------------------------------- # define procs proc ppm2jpg {prefix nf a b ratio} { for {set i 0} {$i < $nf} {incr i} { # take the picture set serial [format "%04d" [expr $i]] puts "convert frame $i" # convert ppm images to jpeg format with resize, crop, etc. combined exec convert ${prefix}.${serial}.ppm -gravity Center -crop ${a}x${b}+0+0 -resize $ratio ${prefix}.${serial}.jpg # exec convert ${prefix}.${serial}.ppm -gravity Center -resize $ratio ${prefix}.${serial}.jpg } } proc addlabel {prefix nf a b llabel} { for {set i 0} {$i < $nf} {incr i} { # take the picture set serial [format "%04d" [expr $i]] puts "add label to frame $i" exec convert -background white -size ${a}x${b} -gravity east label:[lindex $llabel $i] blank.ppm exec convert -append ${prefix}.${serial}.jpg blank.ppm internmediate_file.ppm exec convert internmediate_file.ppm ${prefix}.${serial}.jpg } # Converting frames to animated GIF format exec rm internmediate_file.ppm blank.ppm } proc jpgresize {prefix a b ratio} { set jpgs [glob *.JPG] set i 0 foreach jpg $jpgs { # take the picture incr i set serial [format "%04d" [expr $i]] puts "convert $jpg" exec convert $jpg -gravity Center -crop ${a}x${b}+0+0 -resize $ratio resized-${jpg} } } proc jpg2gif {prefix} { # Converting JPEG images to animated GIF format # exec convert -delay 25 -loop 0 ${prefix}.*.jpg ${prefix}.gif exec convert -delay 20 -loop 0 ${prefix}.*.jpg ${prefix}.gif } # ---------------------------------------------------------- # make .gif animation if {$ConvertPPM2JPG} { puts "$remark Convert PPM images to JPEG files." ppm2jpg $prefix $nf $a $b $r% } if {$AddLabel} { puts "$remark Add label to images (e.g., time of trajectory snapshots)." addlabel $prefix $nf $ar $hlabel $t } if {$jpgs2gif} { puts "$remark Convert JPEG images into GIF animation" jpg2gif $prefix } exit