Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[Résolu] Écrire du texte dans une image avec imagemagick


Messages recommandés

Posté(e)

Bonjour,

 

Dans le cadre de mon boulot, j'acquière des images à la seconde via une caméra

les fichiers sont nommés sous cette forme

trajet_<aammjj>_<hhmmss>.jpg

 

J'en ai 7000 comme ça (2h et + d'acquisition)

 

En parallèle, j'ai un fichier de mesure qui se présente sous la forme d'un fichier texte tabulé ayant pour champ

heure (hh:mm:ss) valeur_x valeur_y valeur_z

 

On me demande d'insérer du texte dans les images, à savoir les valeurs x y et z.

Avec imagemagick, c'est assez simple

convert <nom_du_fichier_jpg> -font Bookman-DemiItalic -draw "text 10,10 '<valeur x> <valeur y> <valeur z>' " <nom_du_fichier_jpg>

 

Le souci c'est qu'en faire une ou deux à la main, ça va mais 7000, je sens que ça va me prendre un chouilla de temps :P

 

J'ai donc commencé à écrire un petit script avec sed et awk

récupération du champ hhmmss de chaque fichier jpg du répertoire, conversion en hh:mm:ss

\ls *.jpg | sed -e 's/^\(.*\)_//' -e 's/null.jpg$//' -e 's/^[0-9][0-9]/&:/' -e 's/^[0-9][0-9]:[0-9][0-9]/&:/'

 

je liste les fichiers jpg

je vire le début du nom du fichier jusqu'au dernier _

je vire l'extension .jpg

j'insère : entre hh et mm

j'insère : entre mm et ss

 

j'obtiens donc pour chaque fichier l'heure de la prise de vue sous la forme hh:mm:ss

 

Fort de ceci, je veux récupérer les valeurs des champs x y et z de mon autre fichier en me basant sur l'heure de la prise de vue

récupération des champs 4 7 et 10 du fichier avec awk

awk -F\\t '$2 ~/^hh:mm:ss/ {print $4}' nom_du_fichier.txt
awk -F\\t '$2 ~/^hh:mm:ss/ {print $7}' nom_du_fichier.txt
awk -F\\t '$2 ~/^hh:mm:ss/ {print $10}' nom_du_fichier.txt

 

je voudrais insérer automatiquement le résultat de la commande sed ci-dessus dans le champ

/^hh:mm:ss/ mais pour chaque ligne retournée par sed

 

J'ai mis le code sed dans un script shell exécutable et de l'appeler comme ceci

awk -F\\t '$2 ~/^' `./script_sed` '/ {print $4}' nom_du_fichier.txt

 

ça marche s'il n'y a qu'un seul fichier image mais dès lors qu'il y en a deux, j'obtiens un

expression régulière non terminée

 

donc je dois m'y prendre comme un manche pour faire en sorte que le traitement de la sortie du script sed soit traité ligne par ligne par le script awk et non dans la globalité comme il a l'air de le faire maintenant :P

 

//edit: note pour demain. Stocker le résultat du premier script dans un fichier temporaire et faire une boucle for sur un cat du fichier temporaire qui appelle awk et convert pour chaque ligne du fichier temporaire

Posté(e)

Tu pars avec un avantage : les noms des fichiers ne comportent pas d'espace ! (essentiel pour un " for x in `ls` " !)

Solution 1 : on part des noms des fichiers et on "grep" les relevés

#!/bin/zsh

for fichier in `\ls trajet_aammjj_*`
do
 # Récupération des heures minutes et secondes
 # TODO : changer les intervalles de cut pour tomber sur les bonnes valeurs
 echo $fichier | cut -c 15-16 | read heure
 echo $fichier | cut -c 17-18 | read minute
 echo $fichier | cut -c 19-20 | read seconde

 # Récupération des données correspondantes
 grep "$heure:$minute:$seconde" releves.txt | read releve
 # TODO : changer les n° de champs de cut pour tomber sur les bonnes valeurs
 echo $releve | cut -d\  -f2 | read valeurx
 echo $releve | cut -d\  -f3 | read valeury
 echo $releve | cut -d\  -f4 | read valeurz

 # Conversion proprement dite
 convert $fichier -font Bookman-DemiItalic -draw "text 10,10 '$valeurx $valeury $valeurz' " $fichier
done

(j'aime zsh !)

 

Solution 2 : on part des relevés et si [ -f trajet_aammjj_$heure$minute$seconde.jpg ] (le fichier image du relevé existe) alors on fait un convert

 

-- edit --

Bon, ok la solution 1 n'est pas optimale parce qu'on va faire 7000 grep sur le fichier de relevés, mais ça ira toujours plus vite que de le faire à la main, non ? ;-)

Posté(e)

:P

 

la solution 1 marche bien

 

ma philosophie d'approche du problème aura été, semble-t-il, pourquoi faire simple quand on peut faire compliqué :P

 

Question bonus: pourquoi cela nécessite-t-il zsh?

  • Tonton a modifié le titre en [Résolu] Écrire du texte dans une image avec imagemagick

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...