Imagemagick 文本到文件批量

Imagemagick 文本到文件批量

我想将文本转换为图像,但文本有所不同。我想将其作为批处理作业。这是我对这个问题的第一次尝试:

#!/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

更新编辑后:希望这次我能理解……

此脚本应该可以运行。
如果没有 png、jpg 或 gif 图像,它会在屏幕上打印错误。
它会提示要求输入文本,如果没有输入,它会跳到下一个,如果输入了,它会添加文本并在 OutputDir 中创建图像。
您可以选择(取消注释相应行)三种方式来更改名称。

#!/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是您写入这些行的文件。

相关内容