StokeBloke.com

Bash Scripts

Image Processing Scripts

I have created some image processing bash scripts which rely on the ImageMagick package. The allow me to simply run the scripts and create the images ready for my website.

Name Processing

A big problem is that the filenames on my USB memory always has upper case filenames, which I hate. This script converts the filenames to lower case.

#!/bin/bash

for name in "$@";
do
newname=`echo $name | tr 'A-Z' 'a-z'`

mv -v "$name" "$newname"
done

Converting sources to website size

I use the following script to auto rotate the jpegs based on the exif meta data.

#!/bin/bash

# see http://www.impulseadventure.com/photo/exif-orientation.html

for img in "$@";
do
  export orientation=`identify -format "%[EXIF:Orientation]" "$img"`
  echo Processing $img $orientation
  
  if [ $orientation == 1 ]
  then
      echo $img is already correct
  else 
      if [ $orientation == 6 ]
      then
          echo $img is 6 rotating
          convert -rotate 90 -quality 100 "$img" "$img"
      fi
      if [ $orientation == 8 ]
      then
          echo $img is 8 rotating
          convert -rotate -90 -quality 100 "$img" "$img"
      fi
  fi
  #convert -rotate 90 -quality 100 "$img" "$img"
done

All my cameras are over 5 megapixel and the jpgs are very large. I always scale the image to be 800x600 or 600x800. The following script converts images which are Landscape to 800x600 and Portrait to 600x800.

#!/bin/bash

for img in "$@";
do

export height=`identify -format %h "$img"`
export width=`identify -format %w "$img"`
let ratio=$width/$height

echo Image $img = [ $width x $height ] = $ratio

if [ $ratio == 0 ]
then
    echo Portrait 0
    convert "$img" -geometry 600x800 -format jpeg -quality 80 "$img"
else
    echo Landscape 1
    convert "$img" -geometry 800x600 -format jpeg -quality 80 "$img"
fi

done

Creating thumbnails

Once I have all the images I need to create the thumbnails, this creates the thumbnails. Any landscape images get thumbnails by simply scaling the image down. Portrait images have thumbnails created by taking the center of the image and creating a thumbnail of 175x109. This is my standard thumbnail size on all my pages.

#!/bin/bash

for img in "$@";
do

export name=`echo $img | awk 'BEGIN {FS="."} {
val = $1
x = 1
while ( x<(NF-1) ) { 
x++
val = val"."$x
}
print val 
}'`

export height=`identify -format %h "$img"`
export width=`identify -format %w "$img"`
let ratio=$width/$height

echo Image $name = [ $width x $height ] = $ratio

if [ $ratio == 0 ]
then
    echo Portrait 0
    convert "$img" -geometry x175 -format jpeg -quality 50 "$name"_s.jpg
else
    if [ $ratio == 1 ]
    then
        echo Landscape 1
        convert "$img" -geometry 175x -format jpeg -quality 50 "$name"_s.jpg
    else
        echo Landscape WIDE
        convert "$img" -geometry 550 -format jpeg -quality 80 "$name"_s.jpg
    fi
fi

done

Video Processing

#!/bin/bash

# Ideal mpeg4 options found somewhere
#opt="vbitrate=2160000:mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:\
#dark_mask=0.2:scplx_mask=0.1:tcplx_mask=0.1:naq"

opt=""
# allow 4 motion vectors per macroblock,
opt="${opt}:v4mv"
# very high quality
opt="${opt}:vhq"
# low quatlity
opt="${opt}:vbitrate=1000000"
# bit rate is ok if you are scaling down later
#opt="${opt}:vbitrate=2160000"
# very good quality
#opt="${opt}:vbitrate=5000000"

# orger of vf options are important
# Apply Donald Graft's adaptive kernel deinterlacer and 
vf="-vf kerndeint"
# scale to qpal: 352x288 (PAL quarter screen)
#vf="${vf},scale=352:288"
# apply a high precision/quality denoise 3D filter
vf="${vf},hqdn3d"

function usage() {
        echo "$0 <source.avi> <dest.avi>"
}

export source=$1
export destination=$2

if [ -z $source ]
then
        usage
        exit 0
fi

if [ -z $destination ]
then
        usage
        exit 0
fi

if [ -f  $destination ]
then
        echo "Error $destination already exists.  WILL not overwrite"
        exit 0
fi

trap "echo 'Control-C - exiting $0' && exit 0" INT

if [ -f $source ]
then
        echo "Encoding $source to $destination"
        mencoder $source $vf -ovc lavc -lavcopts vcodec=mpeg4:vpass=1$opt:acodec=mp3:abitrate=128 \
            -oac lavc -o $destination
        mencoder $source $vf -ovc lavc -lavcopts vcodec=mpeg4:vpass=2$opt:acodec=mp3:abitrate=128 \
            -oac lavc -o $destination
else
        usage
fi
exit 1

Burn a DVD from a directory

Script to check a directory will fit on a DVD

#!/bin/bash

function usage() {
        echo "$0 <directory to burn>"
}

dir=$1

if [ -z $dir ]
then
        usage
        exit 0
fi

if [ -d $dir ]
then 
    du=`du -s "$dir"`
    size=`echo $du | awk 'BEGIN {FS=" "} {print $1}'`
    
    echo Directory is $size kb
    
    # 4590208 DVD size
    if [ $size -gt 4590208 ]
        then 
        let over=4590208-$size
        let over=`echo $over | sed 's/-//g'`
        echo Directory $dir is $over kb oversize
    else 
        let remain=$size-4590208
        let remain=`echo $remain | sed 's/-//g'`
        echo Directory $dir has $remain kb space
    fi
else
    echo Error $dir is not a directory or does not exist
    usage
    exit 0
fi

exit 1

Script to burn a directory to a DVD

#!/bin/bash

function usage() {
        echo "$0 <directory to burn>"
}

dir=$1

if [ -z $dir ]
then
        usage
        exit 0
fi

if [ -d $dir ]
then 
    echo Burning $dir
    growisofs -dvd-compat -Z /dev/dvdrw1 -J -r $dir

    echo Waiting for burn to complete
    
    sleep 5

    mount /mnt/cdrom2

    sleep 1

    ls /mnt/cdrom2

    umount /mnt/cdrom2
fi

Links