Python et Pillow

Python et Pillow - Python - Programmation

Marsh Posté le 22-04-2021 à 14:35:04    

Bonjour
je cherche à manipuler des images avec Python et la bibliothèque Pillow (je suis au niveau 0 ...)
Le code suivant provient de https://github.com/python-pillow/Pillow/issues/2601
 

Code :
  1. >>> from PIL import Image
  2. >>> img = Image.open("01.jpg" )
  3. >>> img.fp
  4. <_io.BufferedReader name='01.jpg'>
  5. >>> img.fp.close()  # success
  6. >>> img = Image.open("01.jpg" )
  7. >>> img.fp
  8. <_io.BufferedReader name='01.jpg'>
  9. >>> px = img.load()  # load() close fp??
  10. >>> img.fp
  11. >>> img.fp.close()  # fail, as the documents claims so that.
  12. Traceback (most recent call last):
  13.   File "<console>", line 1, in <module>
  14. AttributeError: 'NoneType' object has no attribute 'close'
  15. >>>


Voici ma question : que fait l'instruction  
   

Code :
  1. img.fp


de la ligne 3 ?
 
En tapant  
 

Code :
  1. type(img)


la réponse est  
   

Code :
  1. <class 'PIL.PngImagePlugin.PngImageFile'>


 
J'ai cherché des renseignements sur cette classe dans la doc de Pillow et je n'ai rien trouvé sur .fp
Quelqu'un aurait une explication ou un lien ?  
Merci d'avance

Reply

Marsh Posté le 22-04-2021 à 14:35:04   

Reply

Marsh Posté le 22-04-2021 à 15:15:47    

Je ne connais pas python mais en lisant les commentaires suivant qui pointe sur cette page
https://github.com/python-pillow/Pi [...] -280877645
Il semblerait que fp veuillent dire file pointer...
 
Du coups faire un affichage de img.fp c'est du débug pour afficher l''état actuel (enfin je suppose, j'y connais pas grand chose en python ^^).


Message édité par mechkurt le 22-04-2021 à 15:16:39

---------------
D3
Reply

Marsh Posté le 23-04-2021 à 09:58:14    

Merci pour ta contribution
J'ai avancé (un peu...)
l'instruction "img.fp" renvoie dans Pillow un objet BufferedReader dont j'ignore tout.
Ce qui est curieux, c'est que pour renvoyer cet objet sur un fichier texte, on utilise la syntaxe "fichier.buffer" :
 

Code :
  1. # Importing Image from PIL package
  2. from PIL import Image
  3. img = Image.open("MonImage.png" )
  4. print(img.fp)
  5. img.close
  6. fichier = open('test.txt', 'r')
  7. print(fichier.buffer)
  8. fichier.close


Sortie :  

Code :
  1. <_io.BufferedReader name='MonImage.png'>
  2. <_io.BufferedReader name='test.txt'>


Tout ceci est très cohérent, buffer d'un côté, fp de l'autre

Reply

Marsh Posté le 23-04-2021 à 19:55:54    

jpl38 a écrit :

Merci pour ta contribution
J'ai avancé (un peu...)
l'instruction "img.fp" renvoie dans Pillow un objet BufferedReader dont j'ignore tout.
Ce qui est curieux, c'est que pour renvoyer cet objet sur un fichier texte, on utilise la syntaxe "fichier.buffer" :

 
Code :
  1. # Importing Image from PIL package
  2. from PIL import Image
  3. img = Image.open("MonImage.png" )
  4. print(img.fp)
  5. img.close
  6. fichier = open('test.txt', 'r')
  7. print(fichier.buffer)
  8. fichier.close


Sortie :

Code :
  1. <_io.BufferedReader name='MonImage.png'>
  2. <_io.BufferedReader name='test.txt'>


Tout ceci est très cohérent, buffer d'un côté, fp de l'autre


Ce sont des structures différentes dans des bases de code différentes, rien n'impose d'utiliser le même nom d'attribut [:spamafote] D'autant moins quand leur relation au BufferedReader n'est pas la même. Sans même parler du fait que "fp" est un détail d'implémentation.

 

Un "fichier texte", c'est un TextIOWrapper, c'est à dire une couche par dessus un buffer binaire qui va automatiquement s'occuper de l'encodage et du décodage.

 

Quand tu ouvres un fichier en mode binaire, il n'y a pas de couche textuelle (vu que tu veux pas du texte), donc t'as directement … un BufferedReader (accessoirement t'as pas cherché bien loin pour pas le trouver).

 

Une image est généralement binaire, donc pour Pillow un pointeur vers un fichier (binaire) ça va stocker un BufferedReader, il s'en fout du type spécifique il sait juste que c'est ce qui sort de `open` [:spamafote]

 

Accessoirement, en dehors d'être un mauvais style tes accès à "close" font rien du tout, c'est une méthode, une méthode ça s'appelle.


Message édité par masklinn le 23-04-2021 à 20:04:32

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-04-2021 à 20:26:05    

Heureusement que tu précises ne pas connaitre grand chose à Python, on n'a pas les mêmes unités ....
Je suppose que pour les lignes 6 et 9, j'ai oublié les parenthèses.
Pour le bon style tu fais allusion à with ...  as ... ?

Reply

Marsh Posté le 23-04-2021 à 20:55:30    

jpl38 a écrit :

Heureusement que tu précises ne pas connaitre grand chose à Python, on n'a pas les mêmes unités ....


Tu confonds deux personnes différentes.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-04-2021 à 22:36:54    

Merde, toutes mes excuses à vous deux.
Et pour le style lourdingue ?


Message édité par jpl38 le 23-04-2021 à 22:38:45
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed