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

Python Discussion :

Rendre transparent une partie d'une image avec PyGame


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Fonctionnaire
    Inscrit en
    Novembre 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fonctionnaire

    Informations forums :
    Inscription : Novembre 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Rendre transparent une partie d'une image avec PyGame
    Bonjour à tous,

    J'ai une surface A totalement opaque que je voudrais bliter sur une surface B, plus petite et totalement transparente... mais je voudrais qu'une partie de la surface B demeure transparente (un partie non rectangulaire malheureusement). Je réfléchis au moyen de faire ça mais j'aimerais avoir votre avis, surtout qu'il y a peut-être une façon beaucoup plus simple de le faire.

    En gros :
    - soit il y a un moyen de de limiter le blit à une partie seulement de la surface B, mais je ne vois pas comment (d'autant plus qu'elle n'est pas rectangulaire) ;
    - soit je blit comme si de rien n'était et ensuite je transforme chaque pixel de la zone à garder transparente en pixel transparent, avec surfarray.pixels2d()

    Est-ce que ça vous semble une bonne façon de procéder ? Vous voyez un moyen plus simple ? Je précise que le temps de calcul n'est pas trop un souci, car c'est une opération qui ne sera faite qu'une seule fois, au lancement.

    merci à tous !

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Ce que je ne comprends pas dans ta description est de vouloir blit l'image opaque sur l'image transparente, pourquoi ne pas faire l'inverse ? Ce qui serait le plus logique, et avec le blit tu peux très bien définir la partie de l'image A à afficher.
    Le temps ronge l'amour comme l'acide.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Fonctionnaire
    Inscrit en
    Novembre 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fonctionnaire

    Informations forums :
    Inscription : Novembre 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta réponse.

    Je ne vois pas trop comment faire ce que tu proposes. Enfin, je vois comment blit la surface B sur la surface A, mais je ne vois pas comment définir la partie de la surface A à blit ? Surtout que partie sera un rectangle, duquel il faudra enlever des zones triangulaires.

  4. #4
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    En utilisant le 3ème paramètre de blit pour définir quelle partie de l'image à afficher, un rectangle donc.

    Surface.blit(source, dest, area=None, special_flags = 0): return Rect
    Après, tu peux très bien partir d'une surface vierge, et apposer tes parties d'images dessus.
    Le temps ronge l'amour comme l'acide.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Fonctionnaire
    Inscrit en
    Novembre 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fonctionnaire

    Informations forums :
    Inscription : Novembre 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Mais je ne vois pas comment faire ça, dans la mesure où la zone à blit n'est pas rectangulaire, mais composée de plusieurs triangles

  6. #6
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Hum, c'est sans doute clair pour toi, mais pour moi, non.

    Après si tu arrives à récupérer ces triangles de l'image en utilisant surfarray, bah alors il n'y a aucun problème
    Le temps ronge l'amour comme l'acide.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Fonctionnaire
    Inscrit en
    Novembre 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fonctionnaire

    Informations forums :
    Inscription : Novembre 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Désolé, j'avoue ce n'était peut-être pas très clair. En gros je voudrais :

    - Blit l'image B :
    - sur l'image A :
    (le blanc = transparence)

    - en excluant les angles de façon à obtenir ceci :

    (En vrai l'image B n'est pas unie)

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Là, je comprends mieux, pourquoi apposer l'image opaque sur la transparente, puisque les angles seront transparents au final.

    Tu pourrais faire ça avec la méthode filled_trigon du module gfxdraw de pygame, et appliquer la transparence sur la couleur de remplissage.

    J'ai testé pour voir ce que ça peut donner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    import pygame as pg
    from pygame import gfxdraw
     
    couleur_transparence = (100, 0, 120)
     
    pg.init()
     
    ecran = pg.display.set_mode((300, 300))
     
    # Surface jaune
    surf_origine = pg.Surface((200, 100))
    rect_origine = surf_origine.fill((255, 255, 0))
     
    # Triangles
    coords_triangles = (
        (0, 0, 100, 0, 0, 50,), # hg
        (100, 0, 200, 0, 200, 50,), # hd
        (0, 100, 100, 100, 0, 50,), # bg
        (200, 100, 100, 100, 200, 50,), # bd
    )
     
    for coords in coords_triangles :
        gfxdraw.filled_trigon(
            surf_origine,
            *coords,
            couleur_transparence
        )
     
     
    # Définition de la couleur de transparebnce lors du blit
    surf_origine.set_colorkey(couleur_transparence)
     
    # Surface bleue
    surf_dest = pg.Surface((200, 100))
    rect_dest = surf_dest.fill((0, 0, 255))
    rect_dest.topleft = 50, 50
     
     
    surf_dest.blit(surf_origine, (0, 0))
     
    ecran.blit(surf_dest, rect_dest)
    pg.display.update()
     
    clock = pg.time.Clock()
     
    while True :
        events = pg.event.get()
        for event in events :
            if event.type == pg.QUIT :
               break
        else :
            clock.tick(5)
            continue
        break
     
    pg.quit()
    La surface bleu représente la surface transparente, la jaune l'opaque, et il faudra faire attention à définir une couleur de transparence n'étant pas présente dans ton image opaque.

    Je ne sais pas si tu définis tes triangles selon des coordonnées ou selon des couleurs dans ton image, donc cela ne correspond peut-être pas à ce que tu peux faire.
    Le temps ronge l'amour comme l'acide.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Fonctionnaire
    Inscrit en
    Novembre 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fonctionnaire

    Informations forums :
    Inscription : Novembre 2017
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Super, merci, ça correspond parfaitement à ce que je voulais faire ! Je vais essayer de faire ça ce WE.

Discussions similaires

  1. Copier une partie d'une form dans une image
    Par Duan dans le forum Débuter
    Réponses: 5
    Dernier message: 11/05/2009, 16h16
  2. Réponses: 2
    Dernier message: 10/03/2009, 12h45
  3. donner une couleur a une partie d'une forme
    Par ralf91 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2008, 17h02
  4. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  5. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47

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