Mavica 411 image conversion

JBR 2011-12-31 - Back in the distant past I had a Sony Mavica digital camera. Here is some code to convert its native 411 format thumbnail images to ppm and hence allow their display on a Tk canvas.

#!/usr/bin/env tclkit8.6
#

# Utilities
#
 proc K { x y } { set x }
 proc map { args } {
    set body [lindex $args end]
    set reply {}
    foreach {*}[lrange $args 0 end-1] { lappend reply [eval $body] }

    set reply
 }
 proc cat { file } { K [read [set fp [open $file rb]]] [close $fp] }
 proc bytes { data } {
    binary scan $data c* X
    set X
 }


proc tcl::mathfunc::clip { v min max } {
    if { $v < $min } { return $min }
    if { $v > $max } { return $max }

    return $v
}

# Conversion
#
# http://web.archive.org/web/20030819175903/http://mav-magazine.com/Dec1998/code411/code411.htm
#
proc yuvtorgb { Y U V } {
    set R [expr int(clip($Y                    + 1.402 * ($V-128), 0, 255))]
    set G [expr int(clip($Y - 0.344 * ($U-128) - 0.714 * ($V-128), 0, 255))]
    set B [expr int(clip($Y + 1.772 * ($U-128)               , 0, 255))]

    list $R $G $B
}

proc 411toppm { file } {
    set 411 [map x [bytes [cat $file]] { expr $x&0xFF }]
    set rgb [join [map { 1 2 3 4 U V } $411 {
        list {*}[yuvtorgb $1 $U $V]     \
             {*}[yuvtorgb $2 $U $V]     \
             {*}[yuvtorgb $3 $U $V] \
             {*}[yuvtorgb $4 $U $V] }]]

    join [list P6 {64 48} 255 [binary format c* $rgb]] \n
}



# Test
#
set PPM [411toppm MVC-526X.411]

package require Tk

image create photo img -data $PPM

canvas .c -bg blue
.c create image 3 3 -anchor nw  -image img
grid .c