Это когда с одной точки делается серия фотографий (либо в течение дня с определенной периодичностью, либо каждый день в одно и то же время), а затем все эти фотографии объединяются в одной, с каждой берется небольшая узкая вертикальная полоска.
В моем случае это IP-камера, с которой каждые 5 минут снимается скриншот. Я хочу склеить из этих скриншотов цельную фотографию, на которой будет фиксироваться минувший суточный интервал.
На сервере каждые 5 минут запускается скрипт, который получает скриншот с камеры.
Затем он делает следующее (скрипт bash):
- Код: Выделить всё
DIR=/data/sites/.../www/img/live
SRC="$DIR/live_c01.jpg"
DST="$DIR/mix_c01.jpg"
let MIX=60
let NOW=`date +"%s"`-`date --date="00:00" +"%s"`
let NOW/="(86400/$MIX)"
read PRV < /tmp/lastrun.tmp
if [ "$NOW" = "$PRV" ]; then exit ; fi
echo $NOW > /tmp/lastrun.tmp
let MW=`identify -format "%w" "$SRC"`
let MH=`identify -format "%h" "$DST"`
let MS="($MW/$MIX)"
let ML="$MS*($NOW-1)"
let MR="($MS*$NOW)-1"
if [ $NOW -eq $MIX ]; then let MR="$MW-1" ; fi
composite <options> "$SRC" "$DST" "$DST"
Логика здесь следующая.
1. Определяется количество секунд с начала суток.
2. Сутки делятся на 60 интервалов, определяется текущий интервал.
3. Если скрипт уже запускался в текущем интервале, его работа завершается, иначе во временном файле фиксируется текущий интервал.
4. $SRC исходный файл (текущий скриншот с камеры), $DST результирующий файл (split-фотография). Определяем размеры файла (разрешение).
5. Для текущего интервала определяются координаты фрагмента, который нужно вырезать из скриншота.
6. Выполняется наложение с помощью ImageMagick.
Мне не нравится реализация пункта 5.
Если ширина фрагмента получается дробной (то есть ширина файла не делится нацело на количество интервалов), то тут будет накапливаться ошибка округления. Частично она у меня компенсирована (последний интервал занимает весь остаток), но это как-то кривовато.
Для таких случаев обычно используют алгоритм Брезенхэма, но на bash неудобно работать с математикой.
И вопрос с пунктом 6.
Не подскажите ключи для ImageMagick, чтобы выполнить необходимое (то есть наложить на одно изображение фрагмент другого)?
Сейчас я делаю это в два захода (convert -crop, а затем composite), но хотелось бы в один заход и без временных файлов.
- Код: Выделить всё
convert "$SRC" -crop ${MS}x${MH}+${ML}+0 "$TMP/crop.jpg"
composite -geometry +${ML}+0 "$TMP/crop.jpg" "$DST" "$DST"