Thursday, 19 April 2012

Script to automatically create retina and non-retina versions of images

I often get sets of files from graphic designers for iOS apps. Ensuring that the standard and @2x versions of all the files are present and correct is a bit of a pain, for the artist and for myself. The number of times there's been a mispelling in one of the images has been.. well .. many.
Instead I now ask them to send only the retina versions of the images, without the @2x tag in the filename (this has caused confusion).

I then run this script on the whole folder of files, and out pops a folder containing all the files properly renamed and resized. I use the incredible useful 'sips' command-line application that comes with OSX.

The fiddly bit of this script was working out the new size of non-retina images. Yes, they're half the size, but sips doesn't support percentages.
Credit to (person on superuser.com who I'll find eventually) for the neat sed command to extract the pixel size from the output of sips.
Note: clearly the file extension part can be done better. But it works for me right now.
#!/bin/sh
echo "This script will take an input folder full of images and assuming they're all retina sized, output the second folder to have retina and standard sized images."
if [ ! $# == 2 ]; then
echo "Usage: $0 in out"
exit
fi
if [ ! -d $1 ]
then
echo "Please provide a valid input path as first parameter"
exit
fi
if [ ! -d $2 ]
then
echo "Please provide a valid output path as second parameter"
exit
fi
here=`pwd`
inDir="$1"
outDir="$2"
echo "Processing $1.."
cd ${inDir}
# $1 file path of image to process $2 the extension of said file
function process_extension() {
local file="$1"
local ext="$2"
local height=`sips --getProperty pixelHeight "$file" | sed -E "s/.*pixelHeight: ([0-9]+)/\1/g" | tail -1`
local width=`sips --getProperty pixelWidth "$file" | sed -E "s/.*pixelWidth: ([0-9]+)/\1/g" | tail -1`
local at2xFile=`echo "$file" | sed -E "s/(.*)\.$ext/\1@2x.$ext/g"`
echo "$at2xFile @ $height x $width"
local smallHeight=$(($height/2))
local smallWidth=$(($width/2))
echo "$file @ $smallHeight x $smallWidth"
local outFolder="`dirname "$here/$outDir/$file"`"
mkdir -p "$outFolder"
#cp "$here/$inDir/$file" "$here/$outDir/$at2xFile"
# version 2 - re-process EVERYTHING. Useful if silly export settings are used.
sips -z $height $width "$here/$inDir/$file" --out "$here/$outDir/$at2xFile"
sips -z $smallHeight $smallWidth "$here/$inDir/$file" --out "$here/$outDir/$file"
}
# files all files with given extension in folder
# $1 the extension (e.g. png). NO DOT
function do_for_extension () {
local ext=$1
echo "==============================="
echo " Doing $ext files"
echo "==============================="
find * -not -iwholename '*.svn*' -name "*.$ext" | while read file; do
process_extension "$file" $ext
done
}
do_for_extension png
do_for_extension PNG
do_for_extension jpg
do_for_extension JPG
do_for_extension jpeg
do_for_extension JPEG
echo "------------------------------"
echo "DONE"
# go back to original folder
cd -
view raw process.sh hosted with ❤ by GitHub

No comments:

Post a Comment