#------------------------------------------------------------------------ # # Copyright (c) 1997-1998 by Cornell University. # # See the file "license.txt" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # #------------------------------------------------------------------------ # giftoppm.vm # Convert a GIF to one or more PPMs package require DvmBasic package require DvmImap package require DvmPnm package require DvmGif source ../lib/pnmlib.tcl if {$argc < 2} { puts "Enter input GIF file :" set infile [gets stdin] puts "Enter output PPM filename prefix (eg. prefix foo will generate foo0.pgm) :" set outfile [gets stdin] } else { set infile [lindex $argv 0] set outfile [lindex $argv 1] } set hdr [gif_seq_hdr_new] set bp [bitparser_new] set bs [bitstream_new [file size $infile]] set file [open $infile r] fconfigure $file -translation binary -buffersize 65535 bitstream_channel_read $bs $file 0 bitparser_wrap $bp $bs #Parse the sequence header gif_seq_hdr_parse $bp $hdr set rmap [imagemap_new] set gmap [imagemap_new] set bmap [imagemap_new] #Parse the global color table, if present if {[gif_seq_hdr_get_ct_flag $hdr] == 1} then { set ctsize [ gif_seq_hdr_get_ct_size $hdr ] gif_ct_parse $bp $ctsize $rmap $gmap $bmap } # Find the number of images set currPos [ bitparser_tell $bp ] set num 0 while {[gif_img_find $bp] == 0} { gif_img_skip $bp incr num } bitparser_seek $bp $currPos set imgHdr [gif_img_hdr_new] set pnmhdr [pnm_hdr_new] for {set i 0} {$i < $num} {incr i} { #Find the next image and parse its header gif_img_find $bp gif_img_hdr_parse $bp $imgHdr # Allocate a new byte image for each image read, in case some have # different dimensions set w [gif_img_hdr_get_width $imgHdr] set h [gif_img_hdr_get_height $imgHdr] set red [byte_new $w $h] set green [byte_new $w $h] set blue [byte_new $w $h] set indices [byte_new $w $h] #Parse the local color table, if present if {[gif_img_hdr_get_ct_flag $imgHdr] == 1} then { set lrmap [imagemap_new] set lgmap [imagemap_new] set lbmap [imagemap_new] set ctsize [gif_img_hdr_get_ct_size $imgHdr] gif_ct_parse $bp $ctsize $lrmap $lgmap $lbmap } #Parse the index image if {[gif_img_hdr_get_interlaced $imgHdr]} { gif_img_interlaced_parse $bp $hdr $imgHdr $indices } else { gif_img_non_interlaced_parse $bp $hdr $imgHdr $indices } #Create the RGB image by applying the appropriate image map if {[gif_img_hdr_get_ct_flag $imgHdr] == 1} then { imagemap_apply $lrmap $indices $red imagemap_apply $lgmap $indices $green imagemap_apply $lbmap $indices $blue imagemap_free $lrmap imagemap_free $lgmap imagemap_free $lbmap } else { imagemap_apply $rmap $indices $red imagemap_apply $gmap $indices $green imagemap_apply $bmap $indices $blue } # Write the RGB image to disk write_ppm $pnmhdr $red $green $blue ${outfile}${i}.ppm byte_free $red byte_free $green byte_free $blue byte_free $indices }