summaryrefslogtreecommitdiff
path: root/psd_converter.sh
blob: 5256613b91ae5cf19315e544081ecc15fc8b9f5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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"