Newer
Older
webtls / photo6
@HIROSE Yuuji HIROSE Yuuji on 2 Jun 2018 3 KB git gateway started
#!/bin/sh
# photo6 - Make 3x2 arranged photo image from one image
# Last modified Sat Feb 13 20:38:45 2010 on firestorm
# Update count: 13
# $Id: photo6,v 1.5 2010/02/13 11:39:58 yuuji Exp $

myname=`basename $0`
usage () {
  sed -n 2p $0
  cat<<_EOU_
$myname: 
 Arguments...
	-c Original-Photo.jpg   Create center-cropped jpeg files for every
				50-90% range of original JPEG
				元画像の中心部50〜90%の大きさで切り取った
				JPEGファイルを5個生成する。
	Photo.jpg		Generate 3x2 repeated image named photo6.jpg
				Photo.jpgを3x2=6個並べた photo6.jpg を生成
	-t Foo			Change root name of generated file from
				photo6 to Foo
				生成するファイル名のベースを photo6 から
				Fooに変更
	-g			Select Greyscale output
				出力画像をモノクロ(グレースケール)に

Requirement: NetPBM, JPEG library(djpeg and cjpeg)

Sample operation
	1.  Take a person's picture.  Locate throat in the center.
	    履歴書風写真を撮りましょう。喉元が中央に来るようにね。
	2a. Crop outsize of person so that new image size ratio becomes
	    x:y = 42:45 (840x900 for example)...  If you feel troubesome
	    to calculate and operate photo editor, Try 2b.
	    人間が残るように写真の中心部を 横:縦 が 42:45 になるように
	    切り取ろう。たとえば840x900。え、面倒? なら2bへ。
	2b. Try $myname -c photo.jpg
	    and see generated cropped files.
	    Select preferable one.  photo-80%.jpg for example.
	    $myname photo.jpg
	    ってやってわらわらと出てきたファイルを見比べて
	    好きなのを選ぼう。photo-80%.jpg を選んだとする。
	3.  You'll get photo6.jpg by the following example.
	    $myname photo-80%.jpg
            ↑ってやると photo6.jpg に六ッ切用の画像が出てくるよ。
	4.  デジカメ現像屋へGO!
_EOU_
  exit 0
}

conf=~/.photo6rc
verbose=0
margin=5
tmpdir=`mktemp -d /tmp/$myname-XXX`
targetbase=photo6
fmt='-pnm'

RM=/bin/rm

finalize () {			# 途中で ^C されたときにやるべき処理
  $RM -rf $tmpdir		# 特に必要なければ書かない
  echo 'さらばい.'
  exit 1
}
trap finalize INT QUIT		# 拾うシグナルを列挙

# 関数定義をつらつらと

abort () {
  echo "Error on $*" 1>&2
  finalize
}

cut () {
  cx=`expr $ow / 2`
  cy=`expr $oh / 2`
  for p in 5 6 7 8 9 10; do
    nh=`expr $oh \* $p / 10`
    h=`expr $nh - $margin \* 2`
    w=`expr $nh \* 42 / 45 - $margin \* 2`
    sx=`expr $cx - $w / 2`
    sy=`expr $cy - $h / 2`
    tf="${base}-${p}0%.jpg"
    djpeg "$fmt" $file | pnmcut $sx $sy $w $h | pnmmargin -wh $margin |
	 cjpeg > $tf
  done
}

_3x2 () {
  raw="$tmpdir/$base.pnm"
  triple="$tmpdir/$base-3.pnm"
  djpeg "$file" > $raw || abort Creating pnm-image of $1
  pnmcat -lr $raw $raw $raw > $triple || abort Making triple of $1
  pnmcat -tb $triple $triple | cjpeg > $targetbase.jpg \
	|| abort Making photo6.jpg
}

while [ "$1" != "" ];
do
  case "$1" in
    -v)	verbose=1 ;;
    -c) cut=1 ;;
    -h) usage ;;		# -h helpオプション
    -t) shift; targetbase="$1" ;;
    -g) fmt='-grey' ;;
    --) shift; break ;;
    *)	break ;;		# -で始まらないものが来たら即処理突入
  esac
  shift	
done

# そんでメイン
# 引数が一つもなかったらusage表示しておしまい
if [ "$1" = "" ]; then
  usage
fi

sline=`rdjpgcom -v "$1"|head -1`
if [ x"$sline" = x"" ]; then
  (echo "$1" is not JPEG file.
   echo Please use this script for JPEG file) 1>&2
  finalize
  # exit 1
else
  ow=`expr "$sline" : ".* \([0-9][0-9]*\)w.*"`
  oh=`expr "$sline" : ".* \([0-9][0-9]*\)h.*"`
  file="$1"
  base=`expr "$1" : "\(.*\)\.[Jj][Pp][Gg]"`
fi
echo $ow, $oh 1>&2

if [ $cut ]; then
  cut "$1"
else
  _3x2
fi

# おちまい
$RM -rf $tmpdir
exit 0