proc write_jpg_comment {file comment} { set fh [open $file r+] fconfigure $fh -encoding binary -translation binary -eofchar {} if {[read $fh 2] != "\xFF\xD8"} { close $fh; return -code error "not a jpeg file" } while {[read $fh 1] == "\xFF"} { binary scan [read $fh 3] aS type len if {$type == "\xC0"} { set sof [tell $fh]; break } if {$type == "\xFE"} { set com [tell $fh]; break } seek $fh [expr {$len - 2}] current } set clen [binary format S [expr {[string length $comment] + 2}]] if {[info exists com]} { seek $fh 0 start set data1 [read $fh [expr {$com - 2}]] binary scan [read $fh 2] S len seek $fh [expr {$len - 2}] current set data2 [read $fh] close $fh set fh [open $file w] puts -nonewline $fh $data1$clen$comment$data2 } elseif {[info exists sof]} { seek $fh [expr {$sof - 4}] start set data [read $fh] seek $fh [expr {$sof - 4}] start puts -nonewline $fh "\xFF\xFE$clen$comment$data" } else { close $fh return -code error "no image found" } close $fh }
--AF 19-12-03 I think jfif supports more than one comment block but it's not really used since the comments are just unformatted text. This proc replaces the first comment found, otherwise writes a new comment block just before the image data.
See also jpeg, Reading JPEG comments