Tout d'abord, merci de me répondre d'une réponse aussi détaillée, j'ai
juste un peu peur que ce ne soit pas à la portée d'un newbie de mon
espèce (but i'm working hard).
> [...]
>
> Quelques indications qui devraient vous permettre de répondre vous-même
> à vos questions.
> Pour la doc, vous devriez partir de la doc officielle:
>
https://pillow.readthedocs.io/en/latest/
>
> Vous voyez que Pillow est la distribution actuelle de l'historique
> bibliothèque PIL (Pillow est un nom "commercial", c'est bien sous le
> nom de PIL qu'elle sera importée, Pillow n'existe pas dans le code).
0K. J'avais un peu peur de cette histoire de fork...
Voullez-vous dire que lorsque je "cause" avec PIL, j'ai aussi accès aux
fonctions/modules/classes de Pillow ? (Est-ce newbie friendly ?)
Je lis dans les premières lignes du votre lien : « Pillow is the
_friendly_ PIL fork by... », donc a priori, « oui » à ma question.
Je note la distinction que je dois faire entre "bibliothèque" et
"module"...
0K.
(J'essaye de suivre)
Image est un module de la bibliothèque PIL
mais Image est aussi une "classe" du module Image de PIL.
> Parmi les fonctions du module (PIL.Image): open, new, etc.
Liste de fonctions que l'on obtient en tapant dans un shell bash :
hugo@Minty ~ $ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from PIL import Image
>>> dir(Image)
['ADAPTIVE', 'AFFINE', 'ANTIALIAS', 'BICUBIC', 'BILINEAR', 'BOX',
'CONTAINER', 'CUBIC', 'DECODERS', 'DEFAULT_STRATEGY',
'DecompressionBombError', 'DecompressionBombWarning', 'ENCODERS',
'EXTENSION', 'EXTENT', 'FASTOCTREE', 'FILTERED', 'FIXED',
'FLIP_LEFT_RIGHT', 'FLIP_TOP_BOTTOM', 'FLOYDSTEINBERG', 'HAMMING',
'HAS_CFFI', 'HAS_PATHLIB', 'HUFFMAN_ONLY', 'ID', 'Image', 'ImageMode',
'ImagePointHandler', 'ImageTransformHandler', 'LANCZOS',
'LIBIMAGEQUANT', 'LINEAR', 'MAXCOVERAGE', 'MAX_IMAGE_PIXELS',
'MEDIANCUT', 'MESH', 'MIME', 'MODES', 'NEAREST', 'NONE', 'NORMAL',
'OPEN', 'ORDERED', 'PERSPECTIVE', 'PILLOW_VERSION', 'Path', 'QUAD',
'RASTERIZE', 'RLE', 'ROTATE_180', 'ROTATE_270', 'ROTATE_90', 'SAVE',
'SAVE_ALL', 'SEQUENCE', 'TRANSPOSE', 'TRANSVERSE', 'USE_CFFI_ACCESS',
'VERSION', 'WEB', '_E', '_ENDIAN', '_MAPMODES', '_MODEINFO',
'_MODE_CONV', '__builtins__', '__cached__', '__doc__', '__file__',
'__loader__', '__name__', '__package__', '__spec__',
'_apply_env_variables', '_check_size', '_conv_type_shape',
'_decompression_bomb_check', '_fromarray_typemap', '_getdecoder',
'_getencoder', '_getscaleoffset', '_imaging_not_installed',
'_initialized', '_plugins', '_show', '_showxv', '_wedge',
'alpha_composite', 'atexit', 'blend', 'builtins', 'coerce_e',
'collections', 'composite', 'core', 'deferred_error',
'effect_mandelbrot', 'effect_noise', 'eval', 'fromarray', 'frombuffer',
'frombytes', 'fromqimage', 'fromqpixmap', 'fromstring',
'getmodebandnames', 'getmodebands', 'getmodebase', 'getmodetype', 'i8',
'init', 'io', 'isImageType', 'isPath', 'isStringType',
'linear_gradient', 'logger', 'logging', 'math', 'merge', 'new',
'numbers', 'open', 'os', 'preinit', 'radial_gradient',
'register_decoder', 'register_encoder', 'register_extension',
'register_extensions', 'register_mime', 'register_open',
'register_save', 'register_save_all', 'registered_extensions', 'struct',
'sys', 'warnings']
Ce qui me permet de connaître les fonctions que je peux appeler depuis
le code que j'écris.
> Parmi les fonctions (méthodes) de la classe (PIL.Image.Image): convert,
> putpixel, getpixel, etc.
Justement.
Je suis étonné de ne trouver dans la liste ci-dessus, ni convert, ni
putpixel, ni getpixel.
J'ai avancé...
Avant mon code ne marchait pas et je ne savais pourquoi.
Maintenant, mon code marche, mais je ne sais toujours pas pourquoi
puisque je ne vois, dans PIL.Image aucune fonction convert, putpixel ou
getpixel.
> Donc, si je fais juste:
> from PIL import Image
> je n'ai importé que le module PIL.Image, en faisant simplement
> l'économie d'avoir à saisir PIL.Image au profit de Image. La classe
> PIL.Image.Image deviendra Image.Image, c'est tout.
Soit.
> Je vais donc avoir:
> theimage1 = Image.open(blah)
> theimage2 = Image.new(blahblah)
OK.
'open' et 'new' font bien partie des fonctions du module Image de PIL.
> theimage1.putpixel(blah)
> theimage2.show()
Par contre ni 'putpixel' ni 'show' ne sont listées par 'dir(Image)'.
Comment pourrais-je (autrement que par des exemples tirés du web)
savoir que ces fonctions sont disponibles ?
> Mais je peux également faire:
> Image.Image.putpixel(theimage1, blah)
> Image.Image.show(theimage2)
Même remarque.
> Cas particulier:
> Image._show(theimage2)
> fonctionne. C'est un peu un hasard (ne fonctionne pas pour _convert,
> qui n'existe pas), même si la pratique est habituelle. _show(unobjet)
> est une fonction utile au module PIL.Image, l'underscore indique
> qu'elle est vaguement "à usage interne" (peut-être héritée par
> PIL.Image.Image, peu importe en fait), elle ne sera pas importée avec
> *, ne sera pas documentée, etc. Mais reste parfaitement accessible.
0K pour "_show" qui apparaît avec 'dir (Image)'
Reste le problème de 'putpixel' et 'getpixel' qui n'apparaissent pas
comme fonction du module Image de PIL...
> Un code qui utilise des écritures exotiques (les "mais je peux
> également...") masque un problème, et doit être corrigé.
Pas compris
> Pourquoi (par exemple)
> from PIL.Image import *
> est *réellement* bad ?
>
> PIL.Image.open() devient open(). Hors open() est une fonction native
> largement utilisée, elle sera masquée. Il ne sera pas rare d'avoir à
> l'utiliser dans un code incluant PIL.Image.open(). On peut bien sûr
> faire import builtins puis builtins.open(), il est clair que c'est
> débile, ça casse les habitudes, les templates, le copier-coller de
> code, ça fait chier le lecteur du code, et sans doute bien d'autres
> choses.
0K.
Bien compris.
J'ai peur d'abuser de votre temps, mais si vous trouvez moyen de
répondre à mes interrogations, je vous en serais gré