Imagemagick text to file batch

0

Eu quero converter texto em imagens, mas o texto varia. Eu gostaria de fazer disso um trabalho em lote. Esta é minha primeira tentativa com o problema:

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

O número de vezes que eu quero fazer isso varia dependendo do número total de arquivos. $ REPLY é uma linha para gravar na imagem.

O problema é que os nomes dos arquivos aqui são que os números e os arquivos de origem e de destino são sempre os mesmos (aqui o destino é a).

edit: Eu deveria explicar isso pelo exemplo: eu tenho fotos de gato, cachorro e elefante. Em todas as fotos eu quero escrever o nome do animal. Mas da próxima vez eu tenho fotos de urso, gato. veado, cachorro e elefante. E eu quero escrever urso, miau (gato), veado, wuff wuff (cachorro) e mate ou carl ou foo (elefante).

Espero que isso explique pouco do que eu quero. O ponto é o número total de arquivos alternados e o texto a ser escrito para eles será solicitado.

    
por epi 17.05.2014 / 15:29

1 resposta

0

Atualize após a edição: na esperança de que entendi bem desta vez ...

Este script deve funcionar.
Ele imprimirá erros na tela se não houver imagens png, jpg ou gif.
Ele solicitará um texto, se não for inserido, passará para o próximo, se for inserido, ele adicionará o texto e criará a imagem no OutputDir.
Você pode escolher (não comentar a respectiva linha) entre 3 maneiras de mudar o nome.

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

Suponho que seu script original não funcionaria como você acha :-) porque você aninha 2 loop. Dê uma olhada no último comentário desta resposta

Se você se livrar do loop while [ $COUNT -gt 0 ]; do ... done ,
a modificação mínima deve ser para adicionar após a linha com convert ... algo como

mv a "With_Text."$f 

, por exemplo, se o arquivo tiver o nome cat.gif , o novo será renomeado With_Text.cat.gif

Não consigo entender a última frase. A partir do histórico de sua pergunta, eu acho que você quer ler de um arquivo de texto as linhas que você está digitando pelo teclado.

Se for assim, basta executar seu script com este comando

/bin/bash Myscript.sh  < File_With_Text.txt

em que o arquivo File_With_Text.txt é aquele em que você escreve as linhas.

    
por 21.05.2014 / 22:09