#------------------------------------------------------------------------ # # 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. # #------------------------------------------------------------------------ # ppmtogif.vm # Convert a single PPM to a GIF image package require DvmBasic package require DvmColor package require DvmImap package require DvmPnm package require DvmGif source ../lib/pnmlib.tcl if {$argc < 2} { puts "Enter input PPM file :" set infile [gets stdin] puts "Enter output GIF file :" set outfile [gets stdin] } else { set infile [lindex $argv 0] set outfile [lindex $argv 1] } set maxcolors 256 set bp [bitparser_new] set bs [bitstream_new [file size $infile]] set file [open $outfile w] fconfigure $file -translation binary -buffersize 65535 bitparser_wrap $bp $bs set imgs [read_ppm $infile] set red [lindex $imgs 1] set green [lindex $imgs 2] set blue [lindex $imgs 3] set rmap [imagemap_new] set gmap [imagemap_new] set bmap [imagemap_new] set qr [byte_new [byte_get_width $red] [byte_get_height $red]] set qg [byte_new [byte_get_width $red] [byte_get_height $red]] set qb [byte_new [byte_get_width $red] [byte_get_height $red]] set indices [byte_new [byte_get_width $red] [byte_get_height $red]] # Quantize the image to a legal number of colors, initialize the global color table, and convert # the image to an index image set cht [color_hash_table_new 15] color_hash_table_clear $cht rgb_to_256 $red $green $blue $cht $rmap $gmap $bmap color_hash_table_free $cht set cht [color_hash_table_new 16] color_hash_table_clear $cht # Uncomment the following line to quantize using hash table only. # rgb_quant_with_hash_table $red $green $blue $cht $rmap $gmap $bmap $indices set tree [vp_tree_new] vp_tree_init $rmap $gmap $bmap $tree rgb_quant_with_vp_tree $red $green $blue $tree $cht $rmap $gmap $bmap $indices color_hash_table_free $cht # Initialize the sequence header set hdr [gif_seq_hdr_new] gif_seq_hdr_set_width $hdr [byte_get_width $red] gif_seq_hdr_set_height $hdr [byte_get_height $red] gif_seq_hdr_set_ct_flag $hdr 1 gif_seq_hdr_set_version $hdr 87a gif_seq_hdr_set_ct_size $hdr 256 gif_seq_hdr_set_aspect_ratio $hdr 0 gif_seq_hdr_set_resolution $hdr 3 # Encode the sequence header, global color table, and the application extension # indicating to loop the sequence gif_seq_hdr_encode $hdr $bp gif_ct_encode 256 $rmap $gmap $bmap $bp # Initialize the image header set img [gif_img_hdr_new] gif_img_hdr_set_width $img [gif_seq_hdr_get_width $hdr] gif_img_hdr_set_height $img [gif_seq_hdr_get_height $hdr] gif_img_hdr_set_ct_flag $img 0 gif_img_hdr_set_left_position $img 0 gif_img_hdr_set_top_position $img 0 gif_img_hdr_set_interlaced $img 0 gif_img_hdr_set_graphic_control_flag $img 0 #Encode the image header and image gif_img_hdr_encode $img $bp gif_img_encode $hdr $img $indices $bp #Encode the sequence trailer gif_seq_trailer_encode $bp bitstream_channel_write $bs $file 0 close $file byte_free $red byte_free $green byte_free $blue imagemap_free $rmap imagemap_free $gmap imagemap_free $bmap