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"
|