summaryrefslogtreecommitdiff
path: root/combine-images
blob: e1b6e8cc3f085af96c1f021bfe5cdadc345729ae (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
#!/bin/bash

set -e

tmp_dir="$(mktemp -d)"
trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT

if [ $# -ne 3 ]; then
  echo 'Verwendung: combine-images Geometrie Dateistamm_ Endung'
  echo ' Geometrie hat die Form "Breite"x"Hoehe"+"x-Offset"+"y-Offset"'
  exit 1
fi

geometry="$1"
stem="$2"
ending="$3"

files="$(
  ls "$(dirname "${stem}")" | \
    grep "^$(basename "${stem}")[0-9]\+_[0-9]\+\.${ending}\$"
)"

numbers="$(
  echo "${files}" | \
    sed "
      s|^$(basename "${stem}")||
      s|\.${ending}\$||
    " | \
    sort
)"

min_x="$(
  echo "${numbers}" | \
    sed 's|_[0-9]\+$||' | \
    sort -nr | \
    tail -n1
)"

max_x="$(
  echo "${numbers}" | \
    sed 's|_[0-9]\+$||' | \
    sort -n | \
    tail -n1
)"

min_y="$(
  echo "${numbers}" | \
    sed 's|^[0-9]\+_||' | \
    sort -nr | \
    tail -n1
)"

max_y="$(
  echo "${numbers}" | \
    sed 's|^[0-9]\+_||' | \
    sort -n | \
    tail -n1
)"

if ! [ "${numbers}" = "$(
  for ((x=${min_x}; x<=${max_x}; x++)); do
    for ((y=${min_y}; y<=${max_y}; y++)); do
      echo "${x}_${y}"
    done
  done
  )" ]; then
  echo 'Die angegebenen Bilder ergeben kein Rechteck!'
  exit 1
fi

for ((x=${min_x}; x<=${max_x}; x++)); do
  for ((y=${min_y}; y<=${max_y}; y++)); do
    convert "${stem}${x}_${y}.${ending}" -crop "${geometry}" "${tmp_dir}/C${x}_${y}.bmp"
    printf '.'
  done
  convert $(
    for ((y=${max_y}; y>=${min_y}; y--)); do
      printf '%s ' "${tmp_dir}/C${x}_${y}.bmp"
    done
  ) -append "${tmp_dir}/C${x}.bmp"
  printf '.'
done

convert $(
  for ((x=${min_x}; x<=${max_x}; x++)); do
    printf '%s ' "${tmp_dir}/C${x}.bmp"
  done
) +append "${stem%_}.${ending}"
printf '.\n'