diff options
Diffstat (limited to 'psd_converter.sh')
-rwxr-xr-x | psd_converter.sh | 127 |
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" |