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

Calcul scientifique Python Discussion :

PIL - Dessiner avec transparence


Sujet :

Calcul scientifique Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 121
    Points : 80
    Points
    80
    Par défaut PIL - Dessiner avec transparence
    Bonjour,

    Sous Python 3.4, j'essaie de dessiner une ellipse violette transparente au dessus d'un rectangle bleu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    from PIL import Image, ImageDraw
     
    im = Image.new("RGBA", (400,200), (255,255,255,0))
    draw = ImageDraw.Draw(im)
    draw.rectangle(((100,0),(130,200)),fill=(0,0,255,255))
    draw.ellipse([(50, 50), im.size], fill=(255,0,255,100))
    im.save("trace.png", "PNG")
    Mais voila ce que j'obtiens (image jointe) : le fond est bien transparent, mais on ne voit pas le rectangle bleu au travers de l'ellipse.
    Y a-t-il quelque chose qui ne va pas dans mon code ou est-ce un bug ?

    D'avance merci,
    Vincent
    Images attachées Images attachées  

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Il faut lui dire de mixer les images, mais pour cela elles doivent être dessinées séparément.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from PIL import Image, ImageDraw
     
    im = Image.new("RGBA", (400,200), (255,255,255,0))
    draw = ImageDraw.Draw(im)
    draw.rectangle(((100,0),(130,200)),fill=(0,0,255,255))
    front = Image.new("RGBA", (400,200), (255,255,255,0))
    draw = ImageDraw.Draw(front)
    draw.ellipse([(50, 50), im.size], fill=(255,0,255,120))
    im.paste(front, (0, 0), mask=front)
    im.save("trace.png", "PNG")

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 121
    Points : 80
    Points
    80
    Par défaut
    Ah parfait merci, ça fonctionne nickel, par contre je me demande quand même pourquoi la méthode précédente n'a pas été implémentée.

    Bon dimanche,

    Merci encore,
    Vincent

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut Forks de PIL et GD
    T'es pas le seul à questionner le fonctionnement de PIL et c'est d'ailleurs pour ça qu'il existe des forks comme Pillow. Enfin que la bibliothèque graphique de base soit incapable d'afficher des formes géométriques par transparence c'est vraiment pas rassurant. Je viens de PHP et avec GD ta méthode, logique et efficace, fonctionnerait nickel. J'ai repéré qu'il en existe un module Python mais c'est pas encore testé.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par ohnomorejmmings Voir le message
    Enfin que la bibliothèque graphique de base soit incapable d'afficher des formes géométriques par transparence c'est vraiment pas rassurant.
    PIL/Pillow n'est pas une bibliothèque de base mais une bibliothèque externe. Elle est "populaire" car elle est là depuis longtemps mais pas forcément la plus adaptée à vos besoins.

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

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par ohnomorejmmings Voir le message
    Enfin que la bibliothèque graphique de base soit incapable d'afficher des formes géométriques par transparence c'est vraiment pas rassurant.
    Il s'agit là d'une incompréhension du principe même du dessin.

    Lorsqu' un seul support est utilisé, comme dans l'exemple de magicvinni, pour le tracé du rectangle la couleur bleue est affectée au pixel (x, y), ensuite lors du tracé de l'ellipse la couleur mauve est affectée à ce même pixel (x, y) et peu importe que l'opacité ne soit que de 50% les valeurs du pixel sont remplacées parce que c'est cela qui est demandé et rien d'autre. Il n'y a aucune raison que les anciennes valeurs soit "mixées" au nouvelles.

    C'est pour cela qu'il faut utiliser un autre support et ensuite donner instruction à PIL de mixer les deux images.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Je voulais dire que PIL est de base par rapport à son fork Pillow et non pas qu'elle est intégrée à Python.

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    C'est déjà Pillow qu'utilise magicvinni sous Python3.4.

    Pillow n'est que le portage sous Python3 de PIL mais compatible Python2 et sous Debian, par exemple, Pillow a remplacé PIL dans le package pour Python2.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Il s'agit là d'une incompréhension du principe même du dessin. […] Il n'y a aucune raison que les anciennes valeurs soit "mixées" au nouvelles.
    L'implémentation de PIL et d'autres biblios ne doit pas faire oublier le bon sens. Quand on dessine par transparence on s'attend, quelque soit le support (Peinture, infographie…) et même si ça peut sembler naïf quand on s'y connait techniquement, forcément que les pixels soient combinés.

    Citation Envoyé par VinsS Voir le message
    C'est pour cela qu'il faut utiliser un autre support et ensuite donner instruction à PIL de mixer les deux images.
    C'est le choix de PIL. Tu imagines si toutes les autres biblios fonctionnaient comme ça ? On dessine une forme sur une image, on la combine avec une autre, on dessine encore une autre forme, recombinaison… Dans GD il y a la fonction "imagealphablending" et si d'autres solutions comme OpenGL reposent sur ce même principe c'est par souci d'optimisation car par défaut copier "bêtement" les pixels va forcément plus vite.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par ohnomorejmmings Voir le message
    C'est le choix de PIL. Tu imagines si toutes les autres biblios fonctionnaient comme ça ? On dessine une forme sur une image, on la combine avec une autre, on dessine encore une autre forme, recombinaison… Dans GD il y a la fonction "imagealphablending" et si d'autres solutions comme OpenGL reposent sur ce même principe c'est par souci d'optimisation car par défaut copier "bêtement" les pixels va forcément plus vite.
    Si vous préférez GD, libgd est utilisable depuis Python (et des tas d'autres langages de scripting). Maintenant, si votre propos est juste de dire que PIL/Pillow, c'est de la daube... quel intérêt?

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

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous préférez GD, libgd est utilisable depuis Python
    Merci mais c'est justement ce que j'avais écrit dans un autre message.
    Citation Envoyé par wiztricks Voir le message
    Maintenant, si votre propos est juste de dire que PIL/Pillow, c'est de la daube... quel intérêt?
    Pas du tout ! Dans ce contexte elle semble inadaptée si vraiment elle est incapable de dessiner un pixel par transparence sans combiner 2 images.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 252
    Points : 649
    Points
    649
    Par défaut PIL vs. Pillow : Draw
    Citation Envoyé par VinsS Voir le message
    C'est déjà Pillow qu'utilise magicvinni sous Python3.4.
    Merci pour l'info j'ai du louper un épisode. Alors pourquoi il utilise pas le mode de la fonction Draw ?
    Citation Envoyé par VinsS Voir le message
    Pillow n'est que le portage sous Python3 de PIL mais compatible Python2 et sous Debian, par exemple, Pillow a remplacé PIL dans le package pour Python2.
    Je découvre mais une différence que j'ai remarqué c'est justement le support du mélange (blending) alpha par Pillow. Pour se repérer je me sers des pages The ImageDraw Module (The PIL Handbook) et ImageDraw Module — Pillow (PIL Fork) 3.4.2 documentation.

Discussions similaires

  1. Réponses: 24
    Dernier message: 07/02/2016, 10h36
  2. Dessiner sur le bureau HBITMAP avec transparence
    Par Invité dans le forum Windows
    Réponses: 2
    Dernier message: 24/09/2010, 18h21
  3. [JFreeChart] dessins Pie3D avec transparency
    Par bluecameleon dans le forum 2D
    Réponses: 0
    Dernier message: 25/03/2009, 12h09
  4. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42
  5. [Graphic] Dessiner et transparence
    Par Galima dans le forum 2D
    Réponses: 5
    Dernier message: 21/05/2004, 22h19

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