Path: csiph.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: Pierre Maurette Newsgroups: fr.comp.lang.python Subject: Re: manipulation d'image Date: Sat, 17 Aug 2019 17:37:31 +0200 Organization: A noiseless patient Spider Lines: 227 Message-ID: References: Reply-To: maurette.pierre@free.fr Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15"; format=flowed Content-Transfer-Encoding: 8bit Injection-Info: reader02.eternal-september.org; posting-host="f154c9a9bfcedd5de9ed176e72e337f8"; logging-data="20410"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/od/rflIz5olNocDu0K1tcBthZBbpwcHA=" Cancel-Lock: sha1:3rJQhmkX6OjdhF61MwWNYl6dHH4= X-Newsreader: MesNews/1.08.06.00-fr X-Face: cmi$3R1_J{[}5K|8d'LDiJ$SsZ*gn,j*PhJ#KVGt+45,E_N9O}GrhhQ>fb&q<&lz=g%PEv' u"m)N|KrBMux?2:E?N7Uw3L#H>L#GwM}gY:.`W.qu z`1'W'h-AXPmB]#7~<+@H.<0M`-jBkCWbmkcT_*LBVD3|p1a?h1H;cHq{$-vbeP@Hdcqp5z~lwU7ZK `~ Xref: csiph.com fr.comp.lang.python:3223 Lulu : > Le 15-08-2019, Pierre Maurette a écrit : >> Lulu : > > 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. > >> Dans cette bibliothèque, une foule de modules, dont un nous intéresse >> particulièrement (et pour un temps exclusivement): Image : >> https://pillow.readthedocs.io/en/latest/reference/Image.html > > Je note la distinction que je dois faire entre "bibliothèque" et > "module"... > >> Dans ce module, des fonctions et une classe (un objet): Image. Dans >> la même page: >> >> https://pillow.readthedocs.io/en/latest/reference/Image.html#the-image-class > >> C'est peut être confusant, mais en définitive logique. >> Un module: PIL.Image >> Une classe: PIL.Image.Image > > 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é >>> from PIL import Image >>> dir(PIL.Image) ['ADAPTIVE', 'AFFINE', 'ANTIALIAS', 'BICUBIC', 'BILINEAR', 'BOX', 'CONTAINER', 'CUBIC', 'Callable', 'DECODERS', 'DEFAULT_STRATEGY', 'DecompressionBombError', 'DecompressionBombWarning', 'ENCODERS', 'EXTENSION', 'EXTENT', 'Exif', 'FASTOCTREE', 'FILTERED', 'FIXED', 'FLIP_LEFT_RIGHT', 'FLIP_TOP_BOTTOM', 'FLOYDSTEINBERG', 'HAMMING', 'HAS_PATHLIB', 'HUFFMAN_ONLY', 'ID', 'Image', 'ImageMode', 'ImagePointHandler', 'ImageTransformHandler', 'LANCZOS', 'LIBIMAGEQUANT', 'LINEAR', 'MAXCOVERAGE', 'MAX_IMAGE_PIXELS', 'MEDIANCUT', 'MESH', 'MIME', 'MODES', 'MutableMapping', 'NEAREST', 'NONE', 'NORMAL', 'OPEN', 'ORDERED', 'PERSPECTIVE', 'PILLOW_VERSION', 'Path', 'QUAD', 'RASTERIZE', 'RLE', 'ROTATE_180', 'ROTATE_270', 'ROTATE_90', 'SAVE', 'SAVE_ALL', 'SEQUENCE', 'TRANSPOSE', 'TRANSVERSE', 'TiffTags', 'USE_CFFI_ACCESS', 'WEB', '_E', '_ENDIAN', '_MAPMODES', '_MODEINFO', '_MODE_CONV', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_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', 'cffi', 'coerce_e', 'composite', 'core', 'deferred_error', 'effect_mandelbrot', 'effect_noise', 'eval', 'fromarray', 'frombuffer', 'frombytes', 'fromqimage', 'fromqpixmap', 'fromstring', 'getmodebandnames', 'getmodebands', 'getmodebase', 'getmodetype', 'i32le', 'i8', 'init', 'io', 'isImageType', 'isPath', 'isStringType', 'linear_gradient', 'logger', 'logging', 'math', 'merge', 'new', 'numbers', 'open', 'os', 'preinit', 'py3', 'radial_gradient', 'register_decoder', 'register_encoder', 'register_extension', 'register_extensions', 'register_mime', 'register_open', 'register_save', 'register_save_all', 'registered_extensions', 'struct', 'sys', 'warnings'] >>> dir(PIL.Image.Image) ['_Image__transformer', '__array_interface__', '__class__', '__copy__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_close_exclusive_fp_after_loading', '_copy', '_crop', '_dump', '_ensure_mutable', '_expand', '_new', '_repr_png_', 'alpha_composite', 'close', 'convert', 'copy', 'crop', 'draft', 'effect_spread', 'filter', 'format', 'format_description', 'frombytes', 'fromstring', 'getbands', 'getbbox', 'getchannel', 'getcolors', 'getdata', 'getexif', 'getextrema', 'getim', 'getpalette', 'getpixel', 'getprojection', 'height', 'histogram', 'load', 'offset', 'paste', 'point', 'putalpha', 'putdata', 'putpalette', 'putpixel', 'quantize', 'remap_palette', 'resize', 'rotate', 'save', 'seek', 'show', 'size', 'split', 'tell', 'thumbnail', 'tobitmap', 'tobytes', 'toqimage', 'toqpixmap', 'tostring', 'transform', 'transpose', 'verify', 'width'] >>> Voilà ;-) -- Pierre Maurette