我想将文本转换为图像,但文本有所不同。我想将其作为批处理作业。这是我对这个问题的第一次尝试:
#!/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
是您写入这些行的文件。