#!/bin/sh

# Prepare an image for uploading to fotocommunity.
# Dependency: ImageMagick (convert, identify)

# Configuration

SOURCEIMAGE="$1"

LIMIT="150"                 # fotocommunity's size limit
LIMIT2="300"                # fotocommunity's double size limit
MIN_QUALITY="88"            # The minimum acceptable quality for you before switching to double size
                            # Must be lower than QUALITY_FIRST_TRY
QUALITY_FIRST_TRY="90"      # Try this quality level first. Go down or up to match target filesize

SHARPENING="0.75"           # http://www.imagemagick.org/script/command-line-options.php#support
RESIZE_TO="900x900"
OUTER_FRAME_COLOUR="black"
OUTER_FRAME_SIZE="49"       # px
INNER_FRAME_COLOUR="white"
INNER_FRAME_SIZE="1"        # px

# Configuration end


# Heading and some checks
echo "fotocommunity.sh     mail AT patrick-nagel DOT net    2006-10-27"
echo

if [[ "$1" == "" ]]; then {
	echo "Usage: $0 source_file"
	exit 1
}
fi

if [ ! -f "$1" ]; then {
	echo "Error: File "$1" does not exist."
	exit 1
}
fi


# Functions

function doConvert() {

	COUNT=$(( ${COUNT} + 1 ))
	echo "Try ${COUNT} / Quality: ${QUALITY}% / Target size: ${LIMIT}K"

	echo -n "Computing ..."

	convert -interpolate "filter" -filter "Lanczos" -support "${SHARPENING}" -resize "${RESIZE_TO}>" \
		-mattecolor "${INNER_FRAME_COLOUR}" -frame "${INNER_FRAME_SIZE}x${INNER_FRAME_SIZE}" \
		-mattecolor "${OUTER_FRAME_COLOUR}" -frame "${OUTER_FRAME_SIZE}x${OUTER_FRAME_SIZE}" \
		-interlace "line" -quality "${QUALITY}" "${SOURCEIMAGE}" "${RESULTIMAGE}"

	FILESIZE="$(ls -lh ${RESULTIMAGE} | cut -d' ' -f5 | cut -d'K' -f1)"
	RESULT_RESOLUTION="$(identify -format "%wx%h" "${RESULTIMAGE}")"

	echo -e "\b\b\b\b\b\b\b\b\b\b\b\b\bResult: ${RESULTIMAGE} | ${FILESIZE}K | ${RESULT_RESOLUTION}"
	echo

}


# Main

COUNT=0
RESULTIMAGE="${SOURCEIMAGE%.*}_fc.jpg"
SOURCE_FILESIZE="$(ls -lh ${SOURCEIMAGE} | cut -d' ' -f5)"

echo -n "Analysing source file ..."
SOURCE_RESOLUTION="$(identify -format "%wx%h" "${SOURCEIMAGE}")"
echo -e "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bSource: ${SOURCEIMAGE} | ${SOURCE_FILESIZE} | ${SOURCE_RESOLUTION}                       "
echo

QUALITY="${QUALITY_FIRST_TRY}"
doConvert

while (( ${FILESIZE} < ${LIMIT} )); do {
# go up
	QUALITY="$(( ${QUALITY} + 1 ))"
	if (( ${QUALITY} > 100 )); then break; fi
	doConvert
}
done
while (( ${FILESIZE} > ${LIMIT} )); do {
# go down
	if (( ${QUALITY} <= ${MIN_QUALITY} )); then {
		# switch to double size, because quality would be too low already
		echo "*** The image doesn't fit into ${LIMIT}K while maintaining your minimum quality"
		echo "    setting (${MIN_QUALITY}%). Switching to double size mode. Limit is now ${LIMIT2}K."
		echo
		rm -f "${RESULTIMAGE}"
		RESULTIMAGE="${RESULTIMAGE%.*}_double.jpg"
		LIMIT="${LIMIT2}"
		while (( ${FILESIZE} < ${LIMIT} )); do {
			QUALITY="$(( ${QUALITY} + 1 ))"
			if (( ${QUALITY} > 100 )); then break; fi
			doConvert
		}
		done
		while (( ${FILESIZE} > ${LIMIT} )); do {
			QUALITY="$(( ${QUALITY} - 1 ))"
			if (( ${QUALITY} < 0 )); then break; fi
			doConvert
		}
		done
		break
	}
	fi
	QUALITY="$(( ${QUALITY} - 1 ))"
	if (( ${QUALITY} < 0 )); then break; fi
	doConvert
}
done

echo "Finished."
