#!/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"