#!/bin/sh # # View/edit text in a TIFF, PNG, JPEG or GIF file # cmd=$(basename $0) magic=/usr/share/misc/magic-mm template=~/graphics/images/tifftext/template.txt bye() { rm -f $tmptext $tmpfile $tmpstamp exit $1 } usage() { echo "usage: $cmd [-v] file" >&2 exit 1 } if [ $# -eq 0 ]; then vi $template exit 0 fi while getopts ":v" c do case "$c" in v) v_flag=1;; :|'?') usage;; esac done shift $(($OPTIND - 1)) if [ $# -eq 0 ]; then usage; fi if [ ! -f "$1" ]; then echo "$cmd: No such file" >&2; bye 1 fi tmptext=$(mktemp ~/.$cmd.XXXXXX) || bye 1 ts="$(file -m $magic "$1")"; t="${ts#*: }" case "$t" in TIFF\ image\ data*) type=tiff tiffinfo "$1" | nawk ' function output(field) { pos = match($0, /:.*$/) value = substr($0, pos + 3, RLENGTH - 4) gsub(/\\n/, "\n ", value) printf "%-16s%s\n", field, value } /^ Artist:/ { output("artist") } /^ Document Name:/ { output("documentname") } /^ Image Description:/ { output("description") } /^ Date & Time:/ { output("datetime") } /^ Copyright:/ { output("copyright") } /^ Host Computer:/ { output("hostcomputer") } /^ Make:/ { output("make") } /^ Model:/ { output("model") } /^ Software:/ { output("software") } ' >$tmptext ;; PNG\ image\ data*) type=png if [ -n "$v_flag" ]; then pngmeta --quiet "$1" | nawk ' function output() { colon = index($0, ":") printf "%-16s%s\n", substr($0, 1, colon - 1), substr($0, colon + 2) } /^Title: / { output(); next } /^Author: / { output(); next } /^Description: / { output(); next } /^Copyright: / { output(); next } /^Creation Time: / { output(); next } /^Software: / { output(); next } /^Disclaimer: / { output(); next } /^Warning: / { output(); next } /^Source: / { output(); next } /^Comment: / { output(); next } { printf "%16s%s\n", "", $0 }' >$tmptext else tmpfile=$(mktemp ~/.$cmd.XXXXXX) || bye 1 pngtopnm -text $tmptext "$1" >$tmpfile || bye 1 fi ;; JPEG\ image\ data*) type=jpeg tmpfile=$(mktemp ~/.$cmd.XXXXXX) || bye 1 rdjpgcom "$1" | nawk '{ r[n++] = $0 } END { for (i = 0; i < NR - 1; i++) print r[i] if (r[NR - 1] != "") print r[NR - 1] }' >$tmptext ;; GIF\ image\ data*) type=gif gifsicle -I "$1" | nawk ' /^ +comment / { sub(/^ +comment /, ""); gsub(/\\n/, "\n"); r[n++] = $0; next } END { for (i = 0; i < n; i++) print r[i] }' >$tmptext ;; esac if [ -n "$v_flag" ]; then if [ -s $tmptext ]; then less -C $tmptext; fi bye 0 fi if [ \( "$type" = "tiff" \) -a \( ! -s $tmptext \) ]; then cp $template $tmptext || bye 1 fi tmpstamp=$(mktemp ~/.$cmd.XXXXXX) || bye 1 vi $tmptext || bye 1 if [ $tmptext -nt $tmpstamp ]; then case "$type" in tiff) tiffedit "$1" -T $tmptext ;; png) pnmtopng -ztxt $tmptext $tmpfile >"$1" || bye 1 ;; jpeg) wrjpgcom -replace -cfile $tmptext "$1" >$tmpfile mv -f $tmpfile "$1" && chmod go+r "$1" ;; gif) gifsicle -b +c -c "$(cat $tmptext)" "$1" ;; esac fi bye 0 .