IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

création d'un ppm [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2017
    Messages : 22
    Par défaut création d'un ppm
    Bonjour à tous, je rencontre quelques problèmes en enregistrant une image ppm au format P6!
    Lorsque, je l'enregistre au format P3, je n'ai aucun souci mais quand il s'agit de choisir un format qui prend (3*4/3) 4 fois moins de place, il se passe n'importe quoi!
    Après avoir longuement cherché sur la toile, je n'ai trouvé aucun algorithme qui fonctionne! j'ai soit le message d'erreur suivant: TypeError: 'str' does not support the buffer interface ou bien il me crée une image comme celle que vous pouvez voir Nom : image_fractale.jpg
Affichages : 1721
Taille : 71,5 Ko au lieu de me faire la bonne image (enregistrée en ppm P3):Nom : image_fractale_reussi.jpg
Affichages : 1647
Taille : 18,0 Ko .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    fichier=open("image_fractale.ppm","w")
    fichier.write(str.encode("P6\n"+str(requeteur.largeur)+" "+str(requeteur.hauteur)+"\n255\n"))
    dico = {}
    for ligne in matrice:
    	for valeur in ligne:
    		if not(valeur in dico):
    			dico[valeur] = [max(0,min(255,round(eval(requeteur.rvb[i])))) for i,d in enumerate([valeur,valeur,valeur])]
    		for coul in dico[valeur]:
    			#fichier.write(struct.pack('B',coul))
    			fichier.write(chr(coul))
    fichier.close()
    La matrice est une liste de liste qui contient des nombres compris entre 0 et 1 selon la vitesse de la divergence de la suite.
    requeteur.rvb permet de transformer ces valeurs comprises entre 0 et 1 avec des entiers allant de 0 à 255. Par exemple, ici il vaut : ["255*(2**(-30*((d-1)**2)))","255*(2**(-40*((d-0.6)**2)))","160*(2**(-100*((d-0.3)**2)))"]. d étant la variable et chaque rang correspond à chaque couleur Rouge, Vert, Bleu.

    Lorsque je remplace la première ligne par: fichier=open("image_fractale.ppm","wb"), il me renvoi une erreur!

    Help, quelqu'un aurait-il une idée de la syntaxe à adopter? Merci!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par Robin Richard Voir le message
    Help, quelqu'un aurait-il une idée de la syntaxe à adopter? Merci!
    Un problème de syntaxe se traduirait par une exception de type SyntaxError.
    Pour écrire des octets/bytes, vous n'avez pas le choix: il faut ouvrir le fichier en mode "binaire" ("wb") et y écrire des "bytes". Donc la question devient: comment "convertir" une liste de 3 entiers dans 0..255 en "bytes" ? Une solution parmi d'autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> bytes([1, 2, 3])
    b'\x01\x02\x03'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2017
    Messages : 22
    Par défaut
    Merci pour votre réponse, cela permet de remplir le corps de l'image mais qu'en est-il de l'entête? Comment je peut faire pour enregistrer le "P6\nlargeur hauteur\n255" qui est au début?
    Et aussi, la fonction bytes() renvoi des octet complets ou ne renvoi que le nombre de bits nécessaire à la constitution du nombre entier?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par Robin Richard Voir le message
    Comment je peut faire pour enregistrer le "P6\nlargeur hauteur\n255" qui est au début?
    .encode est assez bien, non?

    Citation Envoyé par Robin Richard Voir le message
    Et aussi, la fonction bytes() renvoi des octet complets ou ne renvoi que le nombre de bits nécessaire à la constitution du nombre entier?
    Un byte == un octet.
    Mais vous êtes supposé lire la documentation pour comprendre ce que çà fait avant de l'utiliser et pas juste recopier le code qu'on vous a suggéré dans un forum.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2017
    Messages : 22
    Par défaut
    Bonjour, j'ai regardé la doc afin de ne pas avoir d'erreur mais bien qu'il ne montre aucun problème en apparence, il y a tout de même un pépin: L'image finale est un écran noir! (pourtant, elle prend de la place en mémoire)
    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for i in range(0,2):
    	try:
    		fichier = open(self.path_image, "wb")
    		entete = "P6\n"+str(self.requeteur.largeur)+" "+str(self.requeteur.hauteur)+"\n255\n"
    		fichier.write(entete.encode(encoding="UTF-8"))												#Le retour à la ligne final est nécéssaire
    		fichier.close()
    	except:
    		self.path_image = os.path.join(os.path.dirname(os.path.dirname(self.path_image_finale)), os.path.basename(self.path_image))
    		if i == 1:
    			print("	Erreur accès refusé!")
    			return False
    et puis, plus loin, cette fonction est appelée pour chaque ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    fichier = open(self.path_image, "ab")
    for coul in ligne:
    	for rvb in coul:
    		fichier.write(bytes(rvb))
    fichier.close()
    return None
    Merci encore pour votre aide!

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par Robin Richard Voir le message
    L'image finale est un écran noir! (pourtant, elle prend de la place en mémoire)
    Le noir s'obtient avec r, v, b = 0, 0, 0.
    Si c'est ce qui a été écrit dans le fichier, ce serait cohérent. Mais on ne va pas regarder ce qu'il contient à votre place ni faire un "print" des bytes qui y sont écrits pour voir ce qu'ils sont.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36
  3. [Kylix] Création d'un fichier lien
    Par DrQ dans le forum EDI
    Réponses: 2
    Dernier message: 14/05/2002, 21h30
  4. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo