summaryrefslogtreecommitdiff
path: root/psd_converter.sh
diff options
context:
space:
mode:
Diffstat (limited to 'psd_converter.sh')
-rwxr-xr-xpsd_converter.sh127
1 files changed, 127 insertions, 0 deletions
diff --git a/psd_converter.sh b/psd_converter.sh
new file mode 100755
index 0000000..5256613
--- /dev/null
+++ b/psd_converter.sh
@@ -0,0 +1,127 @@
+#!/bin/bash
+
+while getopts 'hi:' OPTION; do
+ case "$OPTION" in
+ h)
+ echo "you have supplied the -h option"
+ ;;
+ i)
+ variationsfile="$OPTARG"
+ echo "The variations file provided is $OPTARG"
+ ;;
+ ?)
+ echo "script usage: $(basename \$0) [-h] [-i variationsfile]" >&2
+ exit 1
+ ;;
+ esac
+done
+shift "$(($OPTIND -1))"
+
+file="$1"
+filename=$(basename -- "$1")
+filename="${filename%.*}"
+
+[[ -z $file ]] && echo "NO PSD FILE" && exit
+
+if [[ -n "$variationsfile" && -f "$variationsfile" ]]; then
+ [[ -z $( sed -n 1p "$variationsfile" | grep -E "^HEADER:(\s+[0-9]+)*\s*$" ) ]] && echo "WRONG FILE FORMAT (HEADER)" && exit
+ [[ -z $( sed -n 2p "$variationsfile" | grep -E "^FOOTER:(\s+[0-9]+)*\s*$" ) ]] && echo "WRONG FILE FORMAT (FOOTER)" && exit
+ [[ -n $( tail -n +3 "$variationsfile" | grep -E "^(\s+[0-9]+)+\s*$" ) ]] && echo "WRONG FILE FORMAT (VARIATIONS)" && exit
+fi
+
+breakdowndir="/tmp/psd_breakdown_$(echo $RANDOM | md5sum | head -c 5)"
+japanprofile="$HOME/stuf/scripts/dependencies/JapanColor2011Coated.icc"
+rgbprofile="$HOME/stuf/scripts/dependencies/GIMPsRGB.icc"
+
+largestgeometry=""
+largestsurface=0
+
+mkdir -p "$breakdowndir"
+touch "${breakdowndir}/geometries.txt"
+
+last=$( identify "$file" | tail -n 1 | sed -r "s|.*?\[([0-9]*)\].*?|\1|g" )
+needjapan=$( exiftool "$file" | grep -i "Japan Color 2001 Coated" | wc -l )
+
+echo "Number of parts: $last"
+
+for i in $(eval echo "{1..$last}"); do
+ geometry=$( identify "${file}[${i}]" | sed -r "s|^.*?\ ([0-9]+x[0-9]+[\+\-][0-9]+[\+\-][0-9]+)\ .*?$|\1|g" )
+ echo "Processing part ${i}..."
+ x="${geometry%x*}"
+ y="${geometry#*x}"
+ surface=$( bc <<< "${x} * ${y}" )
+ [[ $surface -gt $largestsurface ]] && largestsurface=$surface && largestgeometry=$geometry
+ if [[ needjapan -gt 0 ]]; then
+ convert "${file}[${i}]" -profile "${japanprofile}" -profile "${rgbprofile}" PNG32:"${breakdowndir}/${filename}_${i}_part.png" || break
+ else
+ convert "${file}[${i}]" -profile "${rgbprofile}" $composition PNG32:"${breakdowndir}/${filename}_${i}_part.png" || break
+ fi
+ echo "$i : ${geometry}" >> "${breakdowndir}/geometries.txt"
+done
+
+echo "Largest geometry: $largestgeometry"
+
+if [[ -n "$variationsfile" ]]; then
+
+ imagenum="$(wc -l < "$variationsfile")"
+ ((imagenum-=2))
+
+ echo "Final number of images: $imagenum"
+
+ i=0
+ for part in $( eval echo "$( sed -n 1p "$variationsfile" | sed -r "s|HEADER:||g" )" ) ; do
+ currentpart="${breakdowndir}/${filename}_${part}_part.png"
+
+ alpha="-matte -channel A +level 0,$( bc <<< "100 * $( identify -verbose ${filename}.psd[$part] | grep -i "opacity" | sed -r "s|^.*: ||g" ) / 65535" )% +channel"
+ composition="-compose $( identify -verbose ${filename}.psd[${part}] | grep -i "compose" | sed -r "s|.*: ||g" | tr '[:upper:]' '[:lower:]' )"
+
+ if [[ $i -eq 0 ]]; then
+ headerfile="${breakdowndir}/${filename}_header.png"
+ cp "$currentpart" "$headerfile"
+ else
+ geometry=$( grep "^$part : " "${breakdowndir}/geometries.txt" | cut -d ":" -f 2 | sed -r "s|\ +||g" )
+ convert "$headerfile" \( "$currentpart" $alpha \) -geometry "$geometry" $composition -composite "$headerfile"
+ fi
+ (( i++ ))
+ done
+
+ ((last=imagenum+2))
+ for sed_n in $( eval echo "{3..${last}}" ); do
+ ((finalnum=sed_n-2))
+ finalfile="$(pwd)/${filename}_${finalnum}.png"
+ cp "$headerfile" "$finalfile"
+ echo "Processing image ${finalnum}..."
+ for part in $( eval echo "$( sed -n ${sed_n}p "$variationsfile" ) $( sed -n 2p "$variationsfile" | sed -r "s|FOOTER:||g" )" ); do
+
+ alpha="-matte -channel A +level 0,$( bc <<< "100 * $( identify -verbose ${filename}.psd[$part] | grep -i "opacity" | sed -r "s|^.*: ||g" ) / 65535" )% +channel"
+ composition="-compose $( identify -verbose ${filename}.psd[${part}] | grep -i "compose" | sed -r "s|.*: ||g" | tr '[:upper:]' '[:lower:]' )"
+ echo "$composition"
+
+ [[ $part -eq -1 ]] && continue
+ currentpart="${breakdowndir}/${filename}_${part}_part.png"
+ geometry=$( grep "^$part : " "${breakdowndir}/geometries.txt" | cut -d ":" -f 2 | sed -r "s|\ +||g" )
+ convert "$finalfile" \( "$currentpart" $alpha \) -geometry "$geometry" $composition -composite "$finalfile"
+ done
+ done
+
+else
+
+ imagenum=$( grep "$largestgeometry" "${breakdowndir}/geometries.txt" | wc -l )
+ echo "Final number of images: $imagenum"
+
+ for i in $(eval echo "{1..$last}"); do
+ currentpart="${breakdowndir}/${filename}_${i}_part.png"
+ if [[ $( grep "^$i : $largestgeometry" "${breakdowndir}/geometries.txt" ) ]]; then
+ echo "Processing image ${imagenum}..."
+ currentfile="$(pwd)/${filename}_${imagenum}.png"
+ cp "$currentpart" "$currentfile"
+ (( imagenum-- ))
+ else
+ geometry=$( grep "^$i : " "${breakdowndir}/geometries.txt" | cut -d ":" -f 2 | sed -r "s|\ +||g" )
+ convert "$currentfile" \( "$currentpart" \) -geometry "$geometry" -composite "$currentfile"
+ fi
+ done
+
+fi
+
+rm -rf "$breakdowndir"