Сценарий оболочки для открытия случайных JPEG-файлов с помощью ImageMagick - PullRequest
2 голосов
/ 07 июня 2019

У меня есть большая партия JPEG.Я хотел бы написать сценарий оболочки, который выбирает 5 изображений случайным образом, а затем, используя imageMagick, поместить их в монтаж, а затем открыть этот файл монтажа.Я хотел бы, чтобы этот процесс происходил каждые 10 секунд.

Я пробовал этот скрипт

for f in *.jpg
do
shuf -ezn 5 * | xards -0 -n1 | montage *.jpg | display montage.jpg
done

, но он не работает

Он открывает все изображения и выдает мне следующее сообщение об ошибке

image.sh 7: image.sh: Xards: not found 

Сценарий go.sh хранится в той же папке / каталоге, что и изображения, и теперь выглядит следующим образом:

#!/bin/bash 

# Get list of files into array - just once at start
files=(*.jpg)

# Do forever
first=0
while :; do
   # Shuffle array
   files=( $(shuf -e "${files[@]}") )

   # Make montage of first 5 images in shuffled array
   magick montage ${files[0]} ${files[1]} ${files[2]} ${files[3]} ${files[4]} montage.jpg

   # Start displaying if first pass - leaving "display" running in background updating itself every second
   if [ $first -eq 0 ] ; then
      display -update 1 montage.jpg &
      first=1
   fi

   # Snooze 10 and repeat
   sleep 10
done

Однако это возвращает

go.sh: 4: go.sh: Syntax error: "(" unexpected

Однако, когдаЯ запускаю

bash go.sh

ImageMagick открывает все изображения в папке за один монтаж, и я получаю следующую ошибку

go.sh: line 12: magick: command not found

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Примерно так:

#!/bin/bash

# Get list of files into array - just once at start
files=(*.jpg)

# Do forever
first=0
while :; do
   # Shuffle array
   files=( $(shuf -e "${files[@]}") )

   # Make montage of first 5 images in shuffled array
   magick montage ${files[0]} ${files[1]} ${files[2]} ${files[3]} ${files[4]} montage.jpg

   # Start displaying if first pass - leaving "display" running in background updating itself every second
   if [ $first -eq 0 ] ; then
      display -update 1 montage.jpg &
      first=1
   fi

   # Snooze 10 and repeat
   sleep 10
done

Или это может быть легче понять:

#!/bin/bash

# Get list of files into array
files=(*.jpg)

montage=/tmp/montage.jpg

# Create initial "Loading sign"
convert -background black -fill white -pointsize 64 label:"Loading" $montage
display -update 1 $montage &

# Do forever
while :; do
   # Shuffle array
   files=( $(shuf -e "${files[@]}") )

   # Make montage
   magick montage ${files[0]} ${files[1]} ${files[2]} ${files[3]} ${files[4]} $montage

   # Snooze 10 and repeat
   sleep 10
done

У пользователей macOS может не быть поддержки X11, встроенной в ImageMagick, они могут установить feh, используя homebrew , как это, а также shuf (фактическая команда gshuf) из GNU coreutils:

brew install feh
brew install coreutils

и попробуйте следующую версию:

#!/bin/bash

# Get list of files into array
files=(*.jpg)

montage=/tmp/montage.jpg

# Create initial "Loading sign"
convert -background black -fill white -pointsize 64 label:"Loading" $montage

# Display "feh" running continuously in background passing the same image twice so we can cycle through the list!
feh --title "My Funky Montage" $montage $montage &
fehpid=$!

# Do forever
while :; do
   # Shuffle array
   files=( $(gshuf -e "${files[@]}") )

   # Make montage
   magick montage ${files[0]} ${files[1]} ${files[2]} ${files[3]} ${files[4]} $montage

   # Cycle feh to next image
   kill -s USR1 $fehpid

   # Snooze 10 and repeat
   sleep 10
done
0 голосов
/ 07 июня 2019

Хотите ли вы объединить изображения?В этом случае вы можете сделать что-то вроде:

while true; do    
sleep 10;
montage -mode concatenate -tile 1x $(ls | sort -R | tail -n 5 | paste -sd " " -) montage.jpg && display montage.jpg;
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...