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

DirectX Discussion :

[C#] Sauvegarde de texture dans un fichier + transparence


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut [C#] Sauvegarde de texture dans un fichier + transparence
    bonjour j'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextureLoader.Save(location, m_format, Texture);
    ou meme celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextureLoader.SaveToStream(m_format, Texture);
    Je peux mettre aussi bien bmp que png dans le format, il me sauvegarde toujours ma texture en remplacant la couleur de transparence par du noir.

    Or au chargement de ma texture j'avais spécifié que ma couleur de transparence était les zones bleues.

    du coup quand je recharge derrière, forcément je n'ai plus de transparence puisque dans le fichier il n'y a plus de zones bleues.

    comment faire pour qu'il me sauve l'image en me restituant la couleur bleue en lieu et place de la couleur de transparence ?

    D'avance merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    voici mon code en entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Texture = TextureLoader.FromFile(m_device, location, 0, 0, 0, Usage.None, Microsoft.DirectX.Direct3D.Format.Unknown, Pool.Managed, Filter.Linear, Filter.Linear, Color.Blue.ToArgb(), ref l_imageInformation);
     
    m_format = l_imageInformation.ImageFileFormat;
     
    TextureLoader.Save(location2, m_format, Texture);
    C'est vraiment un point bloquant pour moi.

  3. #3
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    pourquoi est-ce que tu la charges et tu la resauves par derriere ?

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  4. #4
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    C'est un exemple simple pour montrer ou ca coince.

    En fait mon application est plus compliquée et nécessite de charger un bitmap, définir la couleur de transparence, sérialiser les textures dans un fichier jeux. Quand je vuex recharger mon fichier jeu, il n'y a plus de transparence...

  5. #5
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    J'ai essayé avec SurfaceLoader, même problème.
    Est-ce un bug de DirectX ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    Apparemment c'est un bug GDI+.

    J'ai trouvé une solution de contournement qui doit être la seule qui marche mais qui est très gourmande en terme de performance, aussi je ne considère pas le problème comme résolu. Si vous avez trouvé une solution qui est rapide, n'hésitez pas à la poster ici, ca m'intéresse.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je peux mettre aussi bien bmp que png dans le format, il me sauvegarde toujours ma texture en remplacant la couleur de transparence par du noir
    En fait c'est fait au chargement : les pixels ayant la couleur de transparence que tu définis, sont remplacés dans la texture par du noir transparent (cf. la doc du SDK sur la fonction CreateTextureFromFile).

    Ce que tu peux faire, c'est utiliser non pas une couleur de transparence, mais directement un canal alpha. Les formats PNG et TGA peuvent en posséder un.

  8. #8
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    Ok, mais une des règles que je m'étais fixées, c'était de travailler sur des fichiers en .bmp. pour qu'ils puissent être retravaillé par un novice. Et un novice, le canal alpha il vaut mieux ne pas trop lui en parler, tandis que "la couleur bleue devient transparente", il a déjà plus l'habitude s'il s'intéresse un tant soit peu aux effets spéciaux du cinéma.

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans ce cas rien ne t'empêche de repasser un coup sur ta texture pour remplacer le noir transparent par du bleu, avant de la sauvegarder.

  10. #10
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    C'est ce que j'ai été obligé de faire, via un texture toute bleue sur laquelle je viens rendre celle qui comporte des zones alpha, mais bon cette opération a un coût en temps qui est supérieur à une sauvegarde "simple", et sur 5000 images, ca finit par se ressentir. D'où ma question pour savoir si il n'existait pas une astuce, ou alors si MS pensait dans le framework 2.1 (2.0 ?) de .Net enrichir la fonction Save() du paramètre Color, qui dit par quoi on va remplacer la transparence lors de la sauvegarde (ce qui introduit une symétricité avec la fonction de chargement)

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est ce que j'ai été obligé de faire, via un texture toute bleue sur laquelle je viens rendre celle qui comporte des zones alpha, mais bon cette opération a un coût en temps qui est supérieur à une sauvegarde "simple", et sur 5000 images, ca finit par se ressentir
    Tu enregistres combien d'images à la seconde ?

    Sinon tu peux le faire pendant le chargement : ne spécifie aucune couleur de transparence à D3DXCreateTextureFromFileEx et effectue toi-même l'ajout de l'alpha à la main, càd en verrouillant ta texture et en parcourant tous les pixels. D'ailleurs je n'ai toujours pas compris pourquoi D3DX met les pixels transparents en noir, au lieu de mettre juste leur alpha à 0.

  12. #12
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    Je n'ai pas chronométré exactement, c'est un ressenti en tèrme de temps d'attente.

    Pour ce qui est de parcourir chaque pixel de l'image ca peut se réveler encore plus long que la solution précédente (pour chaque image faire 64*64 operations) non ?, d'autant plus que c'est en C# et que là je ne suis pas sur qu'on ait acces directement au buffer réel de l'image en mémoire, tout ce que j'ai réussi à trouver c'est GetSurfaceLevel(0).GetGraphics() qui me levait toujours une exception, et en admettant qu'il ait réussit à me renvoyer un Graphics, j'aurais été obligé d'utiliser une méthode de type setPixel(), qui m'aurait flingué les performances.

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Disons que typiquement ce genre d'opération ne s'effectue pas en temps réel, alors les solutions basées sur le GPU paraissent inappropriées. Mais d'un point de vue perfs c'est vrai que c'est pas forcément plus mal.

    Mais bon, il y a bien un moment où tu as le temps de faire cette manip à la main, que ce soit au chargement ou à la sauvegarde. C'est quoi ton appli exactement ?

  14. #14
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    Un editeur de jeu,

    pour le graphisme des images, je charges un bitmap, qui est ensuite découpé en petites images qui servent à resprésenter une scène.

    Ensuite lorsque l'utilisateur veut sauver son travail, aussi bien la scene que les images, que le texte, que les données du jeu etc... sont sauvegardées dans un fichier unique. Ensuite lorsqu'il recharge le package pour le rééditer tout est extrait du fichier unique, y compris les petites images.

    Si l'utilisateur souhaites remettre à jour une image, elle est sauver en fichier .bmp, il dessine dessus et la réimporte dans le jeu à la place de l'autre, puis le tout et resauver.

    Ma contrainte est que lorsqu'une petite image est en mémoire, vu qu'elle sert à représenter des scènes, la transparence doit être active.

    Et vu qu'il y a beaucoup d'images, je souhaite minimiser au maximum le traitement à faire à la sauvegarde ou au chargement de mes images.

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

Discussions similaires

  1. Sauvegarder les données dans un fichier CSV
    Par beb30 dans le forum MFC
    Réponses: 5
    Dernier message: 08/03/2006, 13h06
  2. Réponses: 5
    Dernier message: 21/10/2005, 11h48
  3. [arbre] Sauvegarder un objet dans un fichier
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 00h55
  4. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23

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