Я хочу конвертировать текст в изображения, но текст меняется. Я хотел бы сделать это пакетной работой. Это мой первый удар по проблеме:

#!/bin/bash

COUNT=$(ls -f *.jpg *.png *.gif | wc -l)

for f in $( ls *.jpg *.png *.gif ); do

while [ $COUNT -gt 0 ]; do
    echo $f
    REPLY=""
        if [ REPLY="" ]; then
            echo \\n"Text?"
            read REPLY
            convert -pointsize 18 -font /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf -fill white -stroke black -strokewidth 1 -draw "text 1,23 '$REPLY'" $f a
        fi
    COUNT=$((COUNT-1))
done

done 

Количество раз, которое я хочу сделать, зависит от общего количества файлов. $ REPLY - строка для записи в изображение.

Проблема в том, что имена файлов здесь состоят в том, что числа, исходные и целевые файлы всегда одинаковы (здесь цель - a).

редактировать: я должен объяснить это на примере: у меня есть фотографии кошки, собаки и слона. На всех картинках я хочу написать имя животного. Но в следующий раз у меня есть фотографии медведя, кота. олень, собака и слон. И я хочу написать «медведь», «мяу» (кошка), «олень», «ваф», «ваф» (собака) и «матовый» или «карл» или «фу» (слон).

Надеюсь, это мало что объясняет из того, что я хочу. Суть в том, что общее количество файлов чередуется, и будет предложен текст для записи в них.

1 ответ1

0

Обновление после редактирования: Надеюсь, я хорошо понял на этот раз ...

Этот скрипт должен работать.
Он выведет вам ошибки на экране, если нет изображений в формате png, jpg или gif.
Он предложит запросить текст, если он не введен, он перейдет к следующему, если введенный добавит текст и создаст изображение в OutputDir.
Вы можете выбрать (не комментируя соответствующую строку) один из 3 способов изменить имя.

#!/bin/bash
OutputDir="Image_With_Text"   # We will put the new images elsewhere (more clean)
mkdir -p $OutputDir           # It creates the dir, if exists it will give no error
for f in $( ls *.jpg *.png *.gif ); do
    printf "# We work on file: $f \n# Enter text or press return to skip:"
    read -r  REPLY
        if [ ! "$REPLY" == "" ]; then
            # Uncomment one of the next 3 options (The last uncommented will work)
            # NewFile=$OutputDir"/Texted."$f         # Here to have a fixed prefix in new name 
            # NewFile=$OutputDir"/"${REPLY}.${f##*.} # Here to have text_inserted.oldname.extention
            NewFile=$OutputDir"/"${REPLY}.$f         # Here to have text_inserted.oldextention (gif,png...)
            printf "# We add text \"$REPLY\" to the file $f\n# $f  --> $NewFile \n\n"
            convert -pointsize 18 -font /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf -fill white -stroke black -strokewidth 1 -draw "text 1,23 '$REPLY'" $f "$NewFile"
        else 
            printf "# We skip the file $f \n\n"
        fi
done 
printf "\n *** DONE *** \n\n"

Я полагаю, ваш оригинальный скрипт не будет работать так, как вы думаете :-) потому что вы вложили 2 цикла. Посмотрите на последний комментарий этого ответа

Если вы избавитесь от цикла while [ $COUNT -gt 0 ]; do ... done ,
минимальная модификация должна быть добавлена после строки с convert ... что-то вроде

mv a "With_Text."$f 

Например, если файл был назван cat.gif новый будет переименован в With_Text.cat.gif


Я не могу понять последнее предложение. Из истории вашего вопроса я предполагаю, что вы хотите прочитать из текстового файла строки, которые вы печатаете с клавиатуры.

Если это так, то достаточно выполнить ваш скрипт с помощью этой команды

/bin/bash Myscript.sh  < File_With_Text.txt

где файл File_With_Text.txt - тот, в котором вы пишете строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .