Créer image PGM

Résolu/Fermé
bendrop Messages postés 12482 Date d'inscription jeudi 30 juin 2005 Statut Contributeur Dernière intervention 17 avril 2024 - Modifié le 13 avril 2022 à 19:05
bendrop Messages postés 12482 Date d'inscription jeudi 30 juin 2005 Statut Contributeur Dernière intervention 17 avril 2024 - 14 avril 2022 à 07:54
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


2 réponses

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
Modifié le 13 avril 2022 à 21:39
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
bendrop Messages postés 12482 Date d'inscription jeudi 30 juin 2005 Statut Contributeur Dernière intervention 17 avril 2024 8 226
Modifié le 14 avril 2022 à 16:27
Merci mamiemando,

Je regarderai cela de près.

Cordialement.
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
13 avril 2022 à 19:57
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
bendrop Messages postés 12482 Date d'inscription jeudi 30 juin 2005 Statut Contributeur Dernière intervention 17 avril 2024 8 226
13 avril 2022 à 20:20
Merci mamiemando,

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

Cdlt.
0