Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/11/2009, à 12:01

damo42

[Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Bonjour

Je suis en train de créer un script qui me permet de convertir plusieurs images dans plusieurs sous-répertoires

$ cd /home/damien/test/

Dans ce répertoire il y a 3 sous-répertoires appelés 1,2 et 3.

Voici le script que je nomme png2jpgtest

#!/bin/bash

COMMAND="convert -quality 80 test.png test.jpg"

# Si on a moins d'un argument, on quitte
[ $# -ne 1 ] && echo 'J'\''ai besoin d'\''un argument !' && exit 1
# Si le répertoire source n'existe pas, on quitte
[ ! -d "$1" ] && echo 'J'\''ai besoin d'\''un répertoire de source valide !' && exit 1
SOURCE="$1"

find "$SOURCE" -iname '*.png' -exec $COMMAND {} \;

J'éxécute le script avec la commande

$ sh png2jpgtest /home/damien/test

Et voici ce que j'obtiens

convert: impossible d'ouvrir l'image `test.png': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: impossible d'ouvrir le fichier `test.png' @ png.c/ReadPNGImage/2888.
convert: impossible d'ouvrir l'image `test.jpg': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: nom de fichier d'image absent `/home/damien/test/1/test.png' @ convert.c/ConvertImageCommand/2806.
convert: impossible d'ouvrir l'image `test.png': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: impossible d'ouvrir le fichier `test.png' @ png.c/ReadPNGImage/2888.
convert: impossible d'ouvrir l'image `test.jpg': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: nom de fichier d'image absent `/home/damien/test/2/test.png' @ convert.c/ConvertImageCommand/2806.
convert: impossible d'ouvrir l'image `test.png': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: impossible d'ouvrir le fichier `test.png' @ png.c/ReadPNGImage/2888.
convert: impossible d'ouvrir l'image `test.jpg': Aucun fichier ou dossier de ce type @ blob.c/OpenBlob/2480.
convert: nom de fichier d'image absent `/home/damien/test/3/test.png' @ convert.c/ConvertImageCommand/2806.

J'ai vérifié si le fichier test.png éxiste bien dans le répertoire 2 par exemple

~/test/2$ ls
test.png

Je ne vois pas d'où viens mon erreur.

Besoin d'aide SVP
Merci

damien

Dernière modification par damo42 (Le 17/11/2009, à 12:35)

Hors ligne

#2 Le 14/11/2009, à 21:55

Ferod

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Bonjour

Je n'ai pas forcement de solution à ton problème mais il y a 2 trucs qui vont pas :
1 - Dans COMMANDE si tu fais un "man convert" tu verras que pour convertir une image, la commande à taper est :

convert input-file [options] output-file

donc il faudrait mettre plutot :

COMMAND="convert test.png -quality 80  test.jpg"

Donc cette commande elle marche. Si tu as un fichier test.png tu verra que ta commande va te générer un test.jpg comme tu le souhaites.

2 - avec le find tu ne peux pas utiliser la commande -exec comme tu le fais ici. Tout ce qu'il y a avant le -exec est bon. D'ailleurs si tu t'arrêtes là tu as surement du constater qu'il te liste correctement tous les fichier png.
Ce qu'il faudrait faire c'est :

find "$SOURCE" -iname '*.png' -exec convert {} -quality 80 fichierDeSortie.jpg \;

Et c'est là que je ne sais pas trop. Parce que j'imagine que tu voudrais que le fichier de sortie soit du même nom que le fichier d'entrée (juste l'extension qui change). A ta disposition tu as le nom du fichier et l'adresse complète dans la variable {} mais il faudrait remplacer png par jpg.

J'ai fais quelques essais mais rien de concluant.


Pour info j'utilise une commande pour convertir des mp3 en ogg et là tu devrais voir comment changer l'extension avec la commande sed.

mkdir ogg
for i in *.mp3 
do 
     new_name=`echo "$i" | sed s/.mp3/.ogg/g` 
     mpg123 -b 10000 -s "$i" | sox -t raw -r 44100 -s -w -c2 - ogg/temp.wav
     oggenc ogg/temp.wav -o ogg/"$new_name" 
done 
rm -f ogg/temp.wav

Bon courage !


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#3 Le 15/11/2009, à 01:44

Mpok

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Agreed with Ferod for 1. and 2. (test not done)

Hors ligne

#4 Le 15/11/2009, à 12:25

damo42

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Merci Ferod & Mpok

@ Ferod
Donc je l'ai corrigé comme ceci

#!/bin/bash

COMMAND="convert test.png -quality 80 test.jpg"

# Si on a moins d'un argument, on quitte
[ $# -ne 1 ] && echo 'J'\''ai besoin d'\''un argument !' && exit 1
# Si le répertoire source n'existe pas, on quitte
[ ! -d "$1" ] && echo 'J'\''ai besoin d'\''un répertoire de source valide !' && exit 1
SOURCE="$1"

find "$SOURCE" -iname 'test.png' -exec convert -quality 80 test.jpg \;

COMMAND ne fonctionne plus pour l'instant mais c'est pas grave.

Et voici le résultat

convert: nom de fichier d'image absent `test.jpg' @ convert.c/ConvertImageCommand/2806.
convert: nom de fichier d'image absent `test.jpg' @ convert.c/ConvertImageCommand/2806.
convert: nom de fichier d'image absent `test.jpg' @ convert.c/ConvertImageCommand/2806.

Est-ce que la commande sed peux servir à convertir des images ?
Peux-tu m'expliquer cette ligne sur ton script de convertion de fichier mp3 en ogg.

new_name=`echo "$i" | sed s/.mp3/.ogg/g`

+
damien

Dernière modification par damo42 (Le 15/11/2009, à 12:32)

Hors ligne

#5 Le 15/11/2009, à 16:59

Ferod

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Re smile
Hier j'ai regardé encore un petit peu la commande mais c'est pas simple. neutral

find "$SOURCE" -iname 'test.png' -exec convert -quality 80 test.jpg \;

J'imagine que tu comprends le message d'erreur : tout est bon jusqu'à convert. Le problème c'est que tu ne spécifies pas de fichier d'entré à la commande convert, donc il te dit qu'il n'a pas de fichier image. Pour cela il faut que tu rajoutes le paramètre {} qui contient l'adresse du fichier. Si tu veux savoir ce que contient {}, tu peux executer le début de la commande :

find /home/tonLogin/test/ -iname '*.png'

D'ailleurs si au lieux de convertir les png t'aurais voulu les compresser, la commande serait :

find /home/tonLogin/test/ -iname '*.png' -exec gzip {} \;

Je te dis tout ça pour que tu comprennes bien ce qu'il y a dans {} parce que c'est un peu abstrait...
Pour la commande convert il nous faut le paramètre d'entrée (l'adresse de l'image à convertir) /home/tonLogin/test/2/test.png : ça c'est bon on l'a dans {} mais il nous faut aussi le paramètre de sortie c'est à dire l'image au format jpg : /home/tonLogin/test/test.jpg. Donc j'ai essayé quelque chose de radical :

find /home/tonLogin/test/ -iname '*.png' -exec convert {} -quality {}.jpg

Ça ne renvoi pas d'érreur, je problème c'est que le nom n'est pas beau puisque c'est test.png.jpg.
Et c'est là que la commande sed va pouvoir te servir. En fait depuis le début on a, dans le {}, l'adresse du fichier png et on cherche l'adresse du fichier jpg. Or c'est très simple, il suffit de remplacer, dans la chaine de caractère {} png par jpg. Et c'est à ça que sert la commande sed : dans un flux de chaine caractères il te permet (entre autre) de remplacer une chaine de caractère par une autre.
Dans le script que je t'ai donné, i contient le nom d'un fichier mp3 (for i in *.mp3). Ensuite le echo $i veut dire d'afficher la valeur de $i. Cette commande est envoyé directement par le pipe | dans la commande sed qui permet de substituer le mp3 en ogg (c'est la signification du s dans "s/.mp3/.ogg/g"). Le "g" à la fin veut dire qu'il faut le faire à chaque fois qu'on rencontre la chaine .mp3. Et cette nouvelle variable est affecté à new_name via les ``.
Voici en "décomposé" ce que ça donne :

$ echo toto.mp3
toto.mp3
$ echo toto.mp3 | sed s/.mp3/.ogg/g
toto.ogg

Au lieu de me renvoyer la chaine toto.mp3, il a fait la substitution. smile
Je pense qu'il faudrait que tu partes sur quelque chose de similaire à ce qu'il y a dans le script, c'est à dire une boucle for. Ça te permettra de faire des choses plus sophistiquées et plus compréhensible. Donc il faudrait que tu partes sur :

for i in find "$SOURCE" -iname '*.png'
do
etc...
done

Bon courage !


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#6 Le 16/11/2009, à 19:57

damo42

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Merci ferod pour ton aide précieuse smile

Voici comment j'ai écrit le script

#!/bin/bash

# Si on a moins d'un argument, on quitte
[ $# -ne 1 ] && echo 'J'\''ai besoin d'\''un argument !' && exit 1
# Si le répertoire source n'existe pas, on quitte
[ ! -d "$1" ] && echo 'J'\''ai besoin d'\''un répertoire de source valide !' && exit 1
SOURCE="$1"

find "$SOURCE" -iname 'test.png' -exec convert {} -quality 85 {}.jpg \;
find "$SOURCE" -iname 'test.png.jpg' -exec rename 's/png.jpg/jpg/' test.jpg {} \;
find "$SOURCE" -iname 'test.png' -exec rm -f test.png {} \;

Je supprime les fichier en png à la fin !

Hors ligne

#7 Le 16/11/2009, à 23:10

Ferod

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

De rien je progresse moi aussi ! wink
Par contre je pense qu'il faut remplacer les test.png par *.png. Si tu veux remplacer tous les fichiers .png.

Edit :
Je suis reparti sur mon idée de boucle for. Voici sur quoi je suis arrivé :

#!/bin/bash

# Si on a moins d'un argument, on quitte
[ $# -ne 1 ] && echo 'J'\''ai besoin d'\''un argument !' && exit 1
# Si le répertoire source n'existe pas, on quitte
[ ! -d "$1" ] && echo 'J'\''ai besoin d'\''un répertoire de source valide !' && exit 1
SOURCE="$1"

for i in `find $SOURCE -name "*.png"`
do
        new_name=`echo "$i" | sed s/.png/.jpg/g`
        convert $i -quality 80 $new_name
        rm $i
done

Ce script marche tout le temps sauf quand le fichier png contient des espaces. Je ne comprends pas pourquoi...

La suite dans un prochain épisode ! smile J'ai les yeux qui se ferment...

Dernière modification par Ferod (Le 16/11/2009, à 23:24)


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#8 Le 16/11/2009, à 23:24

AnsuzPeorth

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Euh...hizoka, avec le find de la redirection, tu risque pas d'avoir des fichiers avec extension en majuscule...tu aurais du utiliser -iname pour cela !

edit:pourquoi as tu effacé ton message hizoka ?
edit2:tient, il est après maintenant smile

Dernière modification par AnsuzPeorth (Le 16/11/2009, à 23:26)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 16/11/2009, à 23:24

Hizoka

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Voila mon code smile

# Liste des fichiers png et les traite
while read fichier
do
	if [[ -z ${fichier} ]]
	then
		echo -e "${FUSHIA}Il n'a pas de fichier png.${NOIR}"
		exit
	fi	

	# Vérifie si l'extension est en miniscule
	if [[ ${fichier##*.} == [Pp][Nn][Gg] && ${fichier##*.} != png ]]
	then
		# Si l'extension est en majuscule
		mv "${fichier}" "${fichier/%[Pp][Nn][Gg]/png}"
	fi
	
	# Conversion des images
	convert -quality 70 "${fichier}" "${fichier/%png/jpg}"
	
	fichier=${fichier##*/}
		
	echo -e "Conversion de ${BLEUFONCE}${fichier}${NOIR} en ${FUSHIA}${fichier/%png/jpg}${NOIR}."
done < <(find "${PWD}" -iname "*.png")

edit 1 : oups en effet smile
edit 2 : j'avais fait une connerie dedans et je pensais pas quelqu'un l'aurait deja lu tongue

Dernière modification par Hizoka (Le 16/11/2009, à 23:27)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#10 Le 16/11/2009, à 23:28

AnsuzPeorth

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Hizoka a écrit :

edit 1 : oups en effet smile
edit 2 : j'avais fait une connerie dedans et je pensais pas quelqu'un l'aurait deja lu tongue

et si, pas de bol..je passais par là par hasard smile
sinon, je trouve que tu te prends la tête pour pas grand chose, je suis sur qu'il y a moyen de faire différent, mais c'est pas le but du topic wink


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#11 Le 16/11/2009, à 23:42

Hizoka

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Mince tongue

bah je pourrais virer la vérification d'extension en fait...

# Couleurs pour echo
FUSHIA="\033[1;35m"
NOIR="\033[1;0m"
BLEUFONCE="\033[1;34m"
VERT="\033[1;32m"

# Liste des fichiers png et les traite
while read fichier
do
    if [[ -z ${fichier} ]]
    then
        echo -e "${FUSHIA}Il n'a pas de fichier png.${NOIR}"
        exit
    fi    
    
    # Conversion des images
    convert -quality 70 "${fichier}" "${fichier/%[Pp][Nn][Gg]/jpg}"
        
    echo -e "Conversion de ${BLEUFONCE}${fichier##*/}${NOIR} en ${FUSHIA}${fichier/%png/jpg}${NOIR}."
done < <(find "${PWD}" -iname "*.png")

tu penses qu'il y a moyen de faire plus simple ?
ça m'interresse alors smile

si on peut s'ameliorer, c'est toujours bon à prendre.

PS : ce code fait partie d'un ensemble plus complexe de commandes

Dernière modification par Hizoka (Le 16/11/2009, à 23:45)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#12 Le 21/11/2009, à 14:29

damo42

Re : [Résolu] Convertir dans plusieurs sous-répertoires des png en jpg

Salut ferod

ferod a écrit :

Par contre je pense qu'il faut remplacer les test.png par *.png. Si tu veux remplacer tous les fichiers .png.

Je l'ai fait exprès férod je voulais seulement convertir que les fichiers png ayant le même nom.
Je viens d'ajouter le script au wiki debian-facile.org
http://debian-facile.org/wiki/bash:png2jpg

Merci

Hors ligne