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

SDL Discussion :

Rendre transparent un PNG déjà transparent


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 8
    Points
    8
    Par défaut Rendre transparent un PNG déjà transparent
    Bonjour,

    J'aimerais blitter plusieurs PNGs (ayant de la transparence) dans une surface, puis blitter la surface obtenue a l'écran. Malheureusement, quand je blit les PNGs, la transparence n'est pas prise en compte, donc quand je blit ma surface composée de plusieurs PNGs, on voit le fond de la surface (on voit le noir de la surface la ou les PNGs sont transparents).

    Ma question est donc de savoir si il est possible de créer une surface entièrement vide (en fait qui n'est pas noire mais qui est remplie de transparence), pour ensuite blitter des images transparentes/semi-transparentes (png) dessus, rendant ainsi la surface belle a regarder lors d'un blittage sur l'écran.

    Merci d'avance

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Actuellement je fait comme ça :

    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
    SDL_Surface* png = IMG_Load("exemple.png");
    SDL_Surface* img = SDL_CreateRGBSurface(SDL_HWSURFACE, png->w, png->h, 32, 0, 0, 0, 0);
     
    /* J'essaye tant bien que mal de remplir la surface de transparence mais ça ne marche pas */
    SDL_FillRect(img, NULL, SDL_MapRGBA(img->format, 0, 0, 0, 0));
    /* J'ai aussi éssayé avec
     - SDL_FillRect(img, NULL, SDL_MapRGB(img->format, 0, 0, 0));
     - SDL_SetAlpha(img, SDL_SRCALPHA, 0);
     - etc.
    mais aucun résultat correct... */
     
    /* blit de l'image pour tester */
    SDL_Rect pos;
    pos.x = 0;
    pos.y = 0;
    SDL_BlitSurface(png, NULL, img, &pos);
    SDL_BlitSurface(img, NULL, ecran, &pos);
     
    SDL_FreeSurface(img);
    SDL_FreeSurface(png);
    Personne n'aurais une petite idée ?

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par paps` Voir le message
    Ma question est donc de savoir si il est possible de créer une surface entièrement vide (en fait qui n'est pas noire mais qui est remplie de transparence),
    Merci d'avance
    euuh une surface de base il faut toujours qu'il y ait une couleur de base sinon cela n'existe pas ou alors il y a n'importe quoi comme couleurs.
    Je n'arrive vraiment pas à comprendre le problème.
    Peux tu faire une copie d'écran de ton problème ?

    Sais-tu ce que c'est une "surface" ? C'est basiquement un espace mémoire un bloc de la carte vidéo avec lignes et colonnes ; le fait d'aller accéder à un pixel en particulier de la carte vidéo cela va colorer un pixel.
    Avant en assembleur on créait un pointeur sur l'adresse de la mémoire vidéo et on allait faire des motifs en colorant les pixels..
    Donc basiquement ce sera toujours noir ou avec des couleurs aléatoires.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Je vois très bien ce qu'est une surface

    Ce que j'entends par remplir de vide une surface, c'est faire en sorte que chaque pixel soit avec un alpha de 0 pour la transparence soit totale. Comme ça quand on blit un png dessus, les pixels transparents laissent la transparence sur la surface finale, alors que les pixels colorés sont bien affichés. Je dit peut-être des bêtises, j'en sais rien.

    Comme j'ai le temps je fait un schéma de ce que je cherche à obtenir :


    J'ai essayé plusieurs méthodes mais aucune n'est concluante.

    Je suis quasiment certain que le problème se trouve à la première étape (c'est à dire le blittage de png sur la surface intermédiare) plutôt que sur la deuxième (le blittage sur l'écran).

    Voila voila.

  5. #5
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    Salut, je n'ai jamais était confronté à ce problème, mais la fonction SDL_DisplayFormatAlpha pourrait peut-être t'aider.

    D'après ce que j'ai vu >> là <<

    Edit : Et aussi, te sers-tu de l'alpha pour de la transparence progressive ? Car si c'est pas le cas, peut-être que SDL_SetColorKey te suffirais, mais je ne pense que ce soit ce que tu veux

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Oui j'aimerais carrément utiliser la transparence progressive, donc le colorkey ne m'intéresse pas

  7. #7
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    Essaye quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #define RED_MASK   0xFF000000
    #define GREEN_MASK 0x00FF0000
    #define BLUE_MASK  0x0000FF00
    #define ALPHA_MASK 0x000000FF
     
    SDL_Surface *source, destination;
     
    source = IMG_Load("exemple.png");
    destination = SDL_CreateRGBSurface(SDL_SWSURFACE, source->w, source->h, 32, RED_MASK, GREEN_MASK, BLUE_MASK, ALPHA_MASK);
     
    SDL_SetAlpha(source, 0, SDL_ALPHA_OPAQUE);
    SDL_FillRect(destination, 0, SDL_MapRGBA(destination->format, 0, 0, 0, 0));
    SDL_BlitSurface(source, 0, destination, 0);
    J'ai pas installer SDL_image, mais si ça ne marche pas, je sens que je vais chercher avec toi

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Waw, ça marche !

    J'ai pas vraiment saisi pourquoi mais merci

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Meme probleme
    Bonjour,

    Je n'ai pas réussi à bliter un png avec son alpha avec le code ci dessus, j'aimerais savoir comment vous avez fait s'il vous plait?

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Compatibilité] transparence des png avec IE
    Par webrider dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 16/08/2006, 09h46
  2. [D5] Zoom d'image PNG avec transparence
    Par Thierry Laborde dans le forum Delphi
    Réponses: 9
    Dernier message: 12/06/2006, 15h41
  3. Réponses: 13
    Dernier message: 01/12/2005, 05h34
  4. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42
  5. [SWT] Problème avec la transparence des PNG
    Par sirjuh dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 02/08/2004, 08h07

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