Python, images et prise de tête

Bonjour,
j'ai raffiné des TP que je compte proposer à mes élèves l'an prochain, en particulier des choses sur les images mais là je craque :
voilà la partie de code qui merdoie.
def SG(filename1,filename2):#transforme un fichier en un fichier Shades of Grey
    im = Image.open(filename1)
    im_SG = Image.new(im.mode,im.size)
    col, lign = im.size
    for x in range(col):
        for y in range(lign):
            r,v,b = im.getpixel((x,y))
            im_SG.putpixel((x,y),(GG(r,v,b),GG(r,v,b),GG(r,v,b)))
    #filename2=add(filename1,'_SG')
    #filename2=filename1+'_SG'
    im_SG.save(filename2)
    return filename2
    im_SG.show()
Je peux éventuellement supprimer la ligne im_SG.show() c'était juste une routine pour voir l'image en Shades of Grey

J'ai aussi une routine add qui transforme truc.xxx en trucp.xxx où "p" est ce que vous voulez, c’est mignon.
Voilà l'erreur. (désolé A.D. ce n'est pas une inversion de sujet, même si mon message était probablement mal formulé)
Traceback (most recent call last):
  File "<string>", line 449, in runcode
  File "<interactive input>", line 1, in <module>
  File "C:\Users\Utilisateur\Desktop\Travail\Python\Traitement_Images\detect_contour.py", line 57, in contour
    Img_SG=SG(filename,filename2)
  File "C:\Users\Utilisateur\Desktop\Travail\Python\Traitement_Images\detect_contour.py", line 42, in SG
    im = Image.open(filename1)
  File "C:\EduPython\App\lib\site-packages\PIL\Image.py", line 2312, in open
    fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'Sacha.png'
Et pourtant je vous promets que j'ai mis le fichier en question dans le répertoire où est le programme (module) python...
Amicalement,
F..D

Réponses

  • Ça serait étonnant sous Windows mais peut-être que la personne qui lance le fichier Python n’a pas le droit de lire le fichier image.
    Tu lances le script à partir de quel répertoire ? Essaie d’écrire le nom complet de l’image, chemin absolu compris.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Hello,

    pour l'emplacement du fichier, je suis certain et ce qui me chiffonne c'est que dans sa version précédente, tout fonctionnait :-/

    Merci de tes conseils,

    F.D.
  • Si tu lances le script dans Powershell (ou MS-DOS) à partir du répertoire courant, ça marche ?
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonsoir,

    merci beaucoup, c'est clairement là que le bât blesse... j'utilise EduPython dont la console ne travaille pas dans le répertoire courant et ça m'empêche de mettre mes noms de fichier en appel de paramètre comme je le voudrais, je dois modifier à chaque utilisation du programme :-(

    C'est pas grave, je vais rajouter une fonction qui synthétise tout ce que je veux (il y a aussi l'option os.chdir ;-) )

    Merci beaucoup,

    Amicalement,

    F.D.
  • Oui et os.sep pour le \ de Windows et en lisant dir(os), regarde les trucs qui contiennent dir.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Merci bcp

    F.D.
  • Lorsque j'ai besoin de lire/écrire dans des fichiers à partir d'un script, j'utilise le code suivant :
    import os
    import inspect
    filename = inspect.getframeinfo(inspect.currentframe()).filename
    path = os.path.dirname(os.path.abspath(filename))
    rep_data=os.path.join(path,'donnees')
    rep_sv=os.path.join(path,'resultat')
    
    qui permet de récupérer le répertoire correspondant au script que j'exécute.

    Je place les données dans le sous répertoire 'données' et je sauvegarde ensuite dans le sous répertoire 'resultat' (rep_sv). Dans le code proposé par FrançoisD, cela donnerait :
    def SG(filename1,filename2):#transforme un fichier en un fichier Shades of Grey
        image_originale=os.path.join(rep_data,filename1)
        im = Image.open(image_originale)
        im_SG = Image.new(im.mode,im.size)
        col, lign = im.size
        for x in range(col):
            for y in range(lign):
                r,v,b = im.getpixel((x,y))
                im_SG.putpixel((x,y),(GG(r,v,b),GG(r,v,b),GG(r,v,b)))
        image_modifiee=os.path.join(rep_sv,filename2)
        im_SG.save(image_modifiee)
    
  • C'est bien compliqué ! Long live Windows!
  • C’est vrai que taper cliquer dans synaptic pour tout mettre à jour et sans perdre de répertoire privé, c’est vachetement compliqué.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonsoir,

    j'ai réglé le problème en créant mon module d'un côté et en l'exécutant dans la console de l'autre... c'est con la vie parfois, la console travaille dans le répertoire mais pas le module (je pense que je vais découvrir pourquoi dans le MOOC sur Python 3 de l'INRIA mais je n'en suis pas encore là

    Très amicalement,

    F.D.

    PS: merci Benoit RIVET, je vais explorer ton programme qui m'a l'air de contenir pas mal d'idées intéressantes
    PPS: de Python à la POO via un MOOC à finir avant le 16/06 avec un taf et deux enfants en bas âge... raaaaah je veux dormir
Connectez-vous ou Inscrivez-vous pour répondre.