Créer image PGM

Résolu
bendrop Messages postés 12659 Date d'inscription   Statut Contributeur Dernière intervention   -  
bendrop Messages postés 12659 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous.

Je dois créer une image pgm sous python.
Voici mon code:
#je cree un fichier pgm
def cree_image(fichier):
 fichier=open(fichier,"w") 
# pour specifier que je vais creer une image en niveaux de gris
 fichier.write("P2\n")
# de 800 pixels sur 800 pixels
 fichier.write("800 800\n")
# chacune des valeurs de 0 a 255 correspond a un niveau de gris
 fichier.write("255\n")
# pour chacun des 800 x 800 pixel de l image je lui affecte un nombre egal au carré de la distance de ce point au point origine
 for j in range (0,800): 
# je calcule modulo 255 pour se ramener dans l intervalle 0 255
  for i in range (0,800):
   fichier.write(str((i**2+j**2)%255)) 
  fichier.write("\n’")
 fichier.close()
cree_image("resultat.pgm")


Je suis censé obtenir cela:


mais à la place j'ai un fichier pgm inexploitable.
Je ne vois pas où est mon erreur car le programme s'exécute sans erreur.

Merci pour l'aide apportée.

Configuration: Linux / Firefox 99.0


“Il est hélas devenu évident aujourd'hui que notre technologie a dépassé notre humanité.” Albert Einstein

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Re bonjour bendrop,

    Voici comment j'aurais écrit ton programme (et là, le résultat est correct) :

    #!/usr/bin/env python3
    
    import sys
    
    def write_pgm(filename, w=800, h=800, n=255):
        with open(filename, "w") as f:
            print(   
                "\n".join([
                    "P2",    
                    " ".join([str(w), str(h)]),
                    str(n),  
                    "\n".join(
                        " ".join(
                            str((i ** 2 + j ** 2) % n)
                            for j in range(w) 
                        )        
                        for i in range(h) 
                    )        
                ]),      
                file=f   
            )
    
    write_pgm("resultat.pgm")


    Je te laisse comparer le résultat obtenu avec les deux programmes pour comprendre où est ton erreur.

    Bonne chance
    2
    1. bendrop Messages postés 12659 Date d'inscription   Statut Contributeur Dernière intervention   8 527
       
      Merci mamiemando,

      Je regarderai cela de près.

      Cordialement.
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Si tu ouvres ton fichier, tu comprendras le problème ;
    • Il manque des espaces entre les valeurs assignées à chacun de tes pixels.


    Par ailleurs, tu peux améliorer ton programme comme suit
    • Pour ouvrir et fermer le fichier, il vaudrait mieux utiliser un context manager (en python :
      with open("resultat.pgm") as f:
      )
    • Pour écrire dans ton fichier, tu peux directement utiliser ton descripteur de fichier avec
      print
      :
      print("plop", file=f)
      ). Il est possible d'omettre le retour chariot en cas de besoin (
      print("plop", end="")
      ).


    Le fichier devient exploitable avec la première correction, mais même si le rendu ressemble à ce que tu attends, ce n'est pas le résultat que tu attends. Vérifie qu'il y a le bon nombre de valeurs pour chaque ligne.

    Bonne chance
    0
    1. bendrop Messages postés 12659 Date d'inscription   Statut Contributeur Dernière intervention   8 527
       
      Merci mamiemando,

      Je verrai cela demain ou après demain et je reviendrai dire ce qu’il en est.

      Cdlt.
      0