Difference between revisions of "Image Resizing"

From IndyMedia
Jump to: navigation, search
(Script for incron)
Line 6: Line 6:
 
* http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
 
* http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
  
The incron tab can be set to have the next years or so of directories to watch or a script could be written to run via cron to update the incron tab at the start of each month -- this would be better.
+
The incron tab could be set to have the next years or so of directories to watch or a script could be written to run via cron to update the incron tab at the start of each month, for example:
 +
 
 +
<syntaxhighlight lang="bash">
 +
#!/bin/bash
 +
 
 +
YEAR=$(date +%Y)
 +
MONTH=$(date +%m)
 +
DIR=/imc/mir/mayday/images/$YEAR/$MONTH/
 +
 
 +
echo "$DIR IN_CLOSE_WRITE /usr/local/bin/exif-strip-resize \$@/\$#"
 +
</syntaxhighlight>
  
 
Image directories are created in this manner, I expect, only as there is content to put in them.
 
Image directories are created in this manner, I expect, only as there is content to put in them.

Revision as of 21:47, 22 June 2011

Script for incron

incron can be set up to run on file creation, see:

The incron tab could be set to have the next years or so of directories to watch or a script could be written to run via cron to update the incron tab at the start of each month, for example:

#!/bin/bash
 
YEAR=$(date +%Y)
MONTH=$(date +%m)
DIR=/imc/mir/mayday/images/$YEAR/$MONTH/
 
echo "$DIR IN_CLOSE_WRITE /usr/local/bin/exif-strip-resize \$@/\$#"

Image directories are created in this manner, I expect, only as there is content to put in them.

/imc/mir/mayday/images/2011/06

And are owned by tomcat6:mayday-tomcat

This script could be used to do the scaling of the images:

#!/bin/bash
 
# this script takes the full path to a jpeg file 
# it scale big ones and also remove all exif metadata
# from the jpeg
 
# check for a command line argument
if [[ $1 ]]; then
 
  FILE=$1
 
  # check the file exists
  if [[ -f $FILE ]]; then
 
    # check if we can write to the file
    if [[ -w $FILE ]]; then
 
      # check if it's really a jpg
      TYPE=$(file -bi $FILE)
      if [[ $TYPE = "image/jpeg; charset=binary" ]]; then
 
         # remove exif metadata preserving the image date
         DATE=$(date -r $FILE)
         exiv2 rm "$FILE"
 
         # generate scaled versions of images if they are greater than 640px wide 
         # or 1024px high, maintaining the aspect ratio
         WIDTH=$(identify -format %w $FILE)
         if [[ $WIDTH > 640 ]]; then
            convert "$FILE" -resize 640x1024 -format jpeg -quality 80 "$FILE.indyscaled.jpg"
            touch -d "$DATE" "$FILE.indyscaled.jpg"
         fi
 
         # reset the file date
         touch -d "$DATE" "$FILE"
 
      else
 
        echo $file is not a jpeg
 
      fi
 
    else
 
      echo $file is not writable
 
    fi
 
  else
 
    echo $file does not exist 
 
  fi
 
else
  echo "You need to specify the full path to a file on the command line to run the script" 
fi

Script to run via cron

This is a script to be run via cron, perhaps once a min to remove exif metadata and to scale jpeg images if they need it.

#!/bin/bash
 
# this script takes a directory with some jpeg files in and 
# will scale the big ones and also remove all exif metadata
# from the jpegs
 
# you can set an optional AGE vairable here, if it's set then only 
# files that are newer than AGE will be looked at -- this is handy 
# if the script is running on a cron job, set it to a tile just longer
# than the cron interval, use mins for the value  
 
AGE=200
 
# Directory of images is passed to this script via $1, if it's 
# not then we assume that we should run in the current directory.
if [[ $1 ]]; then
  # change to the directory where the images are
  cd $1
  DIR=$(pwd)
else
  DIR=$(pwd)
fi
 
 
# get a list of the files, omitting ones that have already been scaled
if [[ $AGE ]]; then
  FILES=$(find -P $DIR -type f -cmin -$AGE -name '*.jpg' ! -name '*\.indyscaled\.jpg')
else
  FILES=$(find -P $DIR -type f -name '*.jpg' ! -name '*\.indyscaled\.jpg')
fi
 
for file in $FILES; do
#echo file: $file
 
  # check the file exists
  if [[ -f $file ]]; then
 
    # check if we can write to the file
    if [[ -w $file ]]; then
 
      # check if it's really a jpg
      TYPE=$(file -bi $file)
      if [[ $TYPE = "image/jpeg; charset=binary" ]]; then
 
         # remove exif metadata preserving the image date
         DATE=$(date -r $file)
         exiv2 rm "$file"
 
         # generate scaled versions of images if they are greater than 640px wide 
         # or 1024px high, maintaining the aspect ratio
         WIDTH=$(identify -format %w $file)
         if [[ $WIDTH > 640 ]]; then
            echo scalling $file
            convert "$file" -resize 640x1024 -format jpeg -quality 80 "$file.indyscaled.jpg"
            touch -d "$DATE" "$file.indyscaled.jpg"
         fi
 
         # reset the file date
         touch -d "$DATE" "$file"
 
      else
 
        echo $file is not a jpeg
 
      fi
 
    else
 
      echo $file is not writable
 
    fi
 
  else
 
    echo $file does not exist 
 
  fi
 
done