#------------------------------------------------------------------------ # # 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. # #------------------------------------------------------------------------ package require DvmBasic package require DvmJpeg package require DvmPnm package require DvmColor source ../lib/pnmlib.tcl if {$argc < 2} { puts "Enter input JPEG file :" set infile [gets stdin] puts "Enter output PPM file :" set outfile [gets stdin] } else { set infile [lindex $argv 0] set outfile [lindex $argv 1] } set bs [bitstream_mmap_read_new $infile] set bp [bitparser_new] bitparser_wrap $bp $bs set h [jpeg_hdr_new] jpeg_hdr_parse $bp $h set s [jpeg_scan_hdr_new] jpeg_scan_hdr_parse $bp $h $s set nc [jpeg_scan_hdr_get_num_of_components $s] set wi [jpeg_hdr_get_width $h] set hi [jpeg_hdr_get_height $h] set bw [expr int(($wi + 7)/8)] set bh [expr int(($hi + 7)/8)] set mbw [jpeg_hdr_get_max_block_width $h] set mbh [jpeg_hdr_get_max_block_height $h] set sclist {} for {set i 0} {$i < $nc} {incr i} { set id [jpeg_scan_hdr_get_scan_id $s $i] set xdec($i) [expr $mbw/[jpeg_hdr_get_block_width $h $id]] set ydec($i) [expr $mbh/[jpeg_hdr_get_block_height $h $id]] lappend sclist [sc_new [expr $bw/$xdec($i)] [expr $bh/$ydec($i)]] } eval jpeg_scan_parse $bp $h $s $sclist set pw [expr $bw*8] set ph [expr $bh*8] set y [byte_new [expr $pw/$xdec(0)] [expr $ph/$ydec(0)]] set u [byte_new [expr $pw/$xdec(1)] [expr $ph/$ydec(1)]] set v [byte_new [expr $pw/$xdec(2)] [expr $ph/$ydec(2)]] set r [byte_new $pw $ph] set g [byte_new $pw $ph] set b [byte_new $pw $ph] sc_i_to_byte [lindex $sclist 0] $y sc_i_to_byte [lindex $sclist 1] $u sc_i_to_byte [lindex $sclist 2] $v if {$mbh == 1} { yuv_to_rgb_422 $y $u $v $r $g $b } else { yuv_to_rgb_420 $y $u $v $r $g $b } set obs [bitstream_new [expr 20 + 3*[byte_get_width $r]*[byte_get_height $r]]] set obp [bitparser_new] bitparser_wrap $obp $obs set out [open $outfile w] fconfigure $out -translation binary set pp [pnm_hdr_new] pnm_hdr_set_width $pp $pw pnm_hdr_set_height $pp $ph pnm_hdr_set_maxval $pp 255 pnm_hdr_set_type $pp ppm-bin pnm_hdr_encode $pp $obp ppm_encode $r $g $b $obp set size [bitparser_tell $obp] bitstream_channel_write_segment $obs $out 0 $size pnm_hdr_free $pp bitparser_free $obp bitparser_free $bp bitstream_free $obs bitstream_mmap_read_free $bs byte_free $y byte_free $u byte_free $v byte_free $r byte_free $g byte_free $b