Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.python > #3223

Re: manipulation d'image

From Pierre Maurette <maurette.pierre@free.fr>
Newsgroups fr.comp.lang.python
Subject Re: manipulation d'image
Date 2019-08-17 17:37 +0200
Organization A noiseless patient Spider
Message-ID <mn.8c217e38df347ccd.79899@free.fr> (permalink)
References (2 earlier) <slrnql8oj8.h4p.lulu042@Minty.Rock-n-Roll.org> <slrnql8qac.j11.lulu042@Minty.Rock-n-Roll.org> <slrnql8s1q.l38.lulu042@Minty.Rock-n-Roll.org> <mn.79c57e38782a91f7.79899@free.fr> <slrnqle525.dfa.lulu042@Minty.Rock-n-Roll.org>

Show all headers | View raw


Lulu :
> Le 15-08-2019, Pierre Maurette <maurette.pierre@free.fr> 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

Back to fr.comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

manipulation d'image Lulu <lulu042@fry.fr.invalid> - 2019-08-14 17:40 +0200
  Re: manipulation d'image Pierre Maurette <maurette.pierre@free.fr> - 2019-08-14 20:35 +0200
    Re: manipulation d'image Lulu <lulu042@fry.fr.invalid> - 2019-08-14 21:35 +0200
      Re: manipulation d'image Lulu <lulu042@fry.fr.invalid> - 2019-08-14 22:04 +0200
        Re: manipulation d'image Lulu <lulu042@fry.fr.invalid> - 2019-08-14 22:34 +0200
          Re: manipulation d'image Pierre Maurette <maurette.pierre@free.fr> - 2019-08-15 07:33 +0200
            Re: manipulation d'image Lulu <lulu042@fry.fr.invalid> - 2019-08-16 22:38 +0200
              Re: manipulation d'image Pierre Maurette <maurette.pierre@free.fr> - 2019-08-17 17:37 +0200
                Re: manipulation d'image Lulu <lulu042@fry.fr.invalid> - 2019-08-17 19:55 +0200

csiph-web