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 :

Jpeg vers cpp pour l'envoyer ensuite à SDL_image


Sujet :

SDL

  1. #1
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut Jpeg vers cpp pour l'envoyer ensuite à SDL_image
    Bonjour, voilà, après moult recherche je ne trouvais pas de programme (toute mes recherches avec google me renvoies vers des codes sources pour convertir une image jpeg vers un autre format, pas vraiment ce que je souhaite...) ou de technique permettant de faire cela :

    Dans le cadre de mon moteur 3D, j'aimerais que la texture par défaut qui remplace les textures introuvables ou manquantes, lors d'un glbind, ne soit pas une texture qui soit sur le disque dure (pour éviter justement tout crash si la texture par défaut venait à manquer.

    Donc je me suis dit que je devais insérer mon image dans mon code source, je sais que c'est possible (c'est à dire convertir un jpeg en cpp), même que quelqu'un sur le forum du Site-du-zero proposait dans sa signature un programme exécutant cela. Mais pas moyen de remettre la main dessus.

    J'ai finit par trouver le programme bin2h qui permet cela, j'ai maintenant un h qui contient un unsigned char* dans lequel se trouve mon image. Le Hic c'est que je ne sais pas trop quoi en faire...

    Comment l'envoyer à SDL_image ? Jusqu'ici j'utilisais des chemins vers mes images (contenue dans un map d'ailleurs) mais maintenant j'ai le fichier, et non son chemin.

    Merci beaucoup de prendre le temps de me lire (si, si ! Si vous lisez ces dernières lignes c'est que vous avez tous lu naan ? ) !

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 381
    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 381
    Points : 20 452
    Points
    20 452
    Par défaut
    Citation Envoyé par Froyok Voir le message
    Dans le cadre de mon moteur 3D, j'aimerais que la texture par défaut qui remplace les textures introuvables ou manquantes, lors d'un glbind, ne soit pas une texture qui soit sur le disque dure (pour éviter justement tout crash si la texture par défaut venait à manquer.
    Si une texture est manquante alors tu peux afficher un objet coloré.
    Par exemple Microsoft Flight Simulator affiche des objets uniformément blancs s'il manque les .bmp à afficher sur l'objet.

    Donc je me suis dit que je devais insérer mon image dans mon code source, je sais que c'est possible (c'est à dire convertir un jpeg en cpp),
    Oui mais tu ne pourras pas faire cela dynamiquement seulement à la compilation du programme.
    Pour convertir un jpeg en .cpp il suffit de lire le fichier octet par octet avec fgetc() puis tu remplis un tableau de char[] !

  3. #3
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Si une texture est manquante alors tu peux afficher un objet coloré.
    Par exemple Microsoft Flight Simulator affiche des objets uniformément blancs s'il manque les .bmp à afficher sur l'objet.
    Haaa, pas bête ça tiens !
    Cela ne m'étais pas venu à l'esprit.


    Citation Envoyé par Mat.M Voir le message
    Oui mais tu ne pourras pas faire cela dynamiquement seulement à la compilation du programme.
    Tu parles bien de laisser le fichier présent, puis une fois le programme compilé et la ressource ajouté dans l'exécutable, de supprimer le fichier image source. Si tel est le cas, c'est ce que je souhaiterais faire. Malheureusement quand j'essaye de le linker dans code blocks j'ai un beau "linker input file unused because linking not done"

    Citation Envoyé par Mat.M Voir le message
    Pour convertir un jpeg en .cpp il suffit de lire le fichier octet par octet avec fgetc() puis tu remplis un tableau de char[] !
    Cette étape est déjà faite grâce à Bin2H, il ma créer un header qui déclare un unsigned char* contenu mon jpeg !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 16
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    Salut,

    je ne suis pas sûr, mais ton problème est-il résolu? Quand on utilise bin2h, pas besoin de linker le fichier, un simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char *ressource = 
    {
      #include "fichier.h"
    };
    est suffisant.

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 381
    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 381
    Points : 20 452
    Points
    20 452
    Par défaut
    Salut Froyok je ne comprends pas du tout ce que tu veux faire ;pourrais-tu détailler point par point avec des étapes ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 16
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    En fait il convertit un fichier quelconque en code C++.


    Par exemple si le fichier commence par 'abc', le code C++ correspondant sera :

    Et ainsi en faisant un include comme ci-dessus on peut directement charger la ressource dans l'exécutable.

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Bonjour,

    en fait la bonne syntaxe c'est avec un const char[].

    cf http://www.sfml-dev.org/forum-fr/vie...t=1977&start=0 pour plus de renseignements.

  8. #8
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut
    Désolé pour la/les réponses tardives. Entre temps j'étais en période de bac... et je codais autre chose !

    Donc, le truc, c'est qu'avec bin2hash j'ai bien un char, qui contient mon jpeg.
    Mais il est en unsigned char, et SDL_image ne prends en paramètre qu'un const char. Je ne vois pas du tout comment le convertir, ou l'adapter à SDL_image, c'est à ce niveau que j'ai vraiment besoin d'aide.

    Les techniques de concertions classique pour un unsigned ver sun const char ne fonctionne pas car mon char est trop grand.

  9. #9
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Tu as essayé de cette manière?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char ressource[] = 
    {
    #include "ressource.hpp"
    };
    Non pas avec un char* mais avec un char[]?

    Sinon donne le lien jpeg, je vais essayer

  10. #10
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut
    Si tu veux t'amuser...
    c'est ici : http://www.gamemakers.fr/default.h

    Je n'ais pas le temps de tester ta méthode, désolé.
    Plus tard dans la soirée surement. Merci pour l'astuce !

    [EDIT] lien corrigé

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pas besoin d'inclure l'en-tête dans un tableau, il en définit déjà un.
    Ensuite pas besoin non plus de définir la taille, c'est juste sizeof(le_tableau).

    Pour le reste : http://jeux.developpez.com/faq/sdl/?page=rwops

  12. #12
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    C'est une jolie image que tu as là

    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
    57
    58
    59
    60
    61
    62
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <iostream>
     
    using namespace std;
     
    SDL_Surface *affichage;
     
    void exit_error(const char *desc)
    {
        cout << "Error -- " << desc << SDL_GetError() << endl;
        exit(1);
    }
     
    void attendre_touche()
    {
        SDL_Event event;
        while (SDL_WaitEvent(&event))
        {
            switch (event.type)
            {
                case SDL_QUIT:
                    return;
                case SDL_KEYDOWN:
                    return;
                default:
                    break;
            }
        }
    }
     
    #include "main.h"
     
    int main(int argc, char **argv)
    {
        if (SDL_Init(SDL_INIT_VIDEO) < 0) {
            exit_error("SDL_Init: ");
        }
     
        atexit(SDL_Quit);
     
        SDL_Surface *s = IMG_LoadTyped_RW(SDL_RWFromConstMem(file, file_size), 0, "jpg");
     
        if (!s) {
            exit_error("IMG_LoadTyped_RW: ");
        }
     
        affichage = SDL_SetVideoMode(s->w, s->h, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
        if (affichage == NULL) {
            exit_error("SDL_SetVideoMode");
        }
     
        SDL_BlitSurface(s, NULL, affichage, NULL);
     
        SDL_Flip(affichage);
     
        attendre_touche();
     
        SDL_Quit();
     
        return 0;
    }
    En remplaçant "-nosize" par "file" et "-nosize_size" par "file_size" dans default.h qui est ici devenu main.h .

    Sur ce je pars en exil

  13. #13
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Pas besoin d'inclure l'en-tête dans un tableau, il en définit déjà un.
    Ensuite pas besoin non plus de définir la taille, c'est juste sizeof(le_tableau).

    Pour le reste : http://jeux.developpez.com/faq/sdl/?page=rwops
    J'ai jeté un coup d'oeil à SDL_rwops, mais je n'avais pas très bien compris, et surtout cela ne fait que charger un fichier depuis un fichier compressé non ?
    Pour le sizeof, j'ai simplement suivie la commande donnée sur le site de bin2h, pensant qu'elle était nécessaire.

    Citation Envoyé par coyotte507 Voir le message
    C'est une jolie image que tu as là

    --CODE--

    En remplaçant "-nosize" par "file" et "-nosize_size" par "file_size" dans default.h qui est ici devenu main.h .

    Sur ce je pars en exil
    haaarf, je n'ai pas encodé la bonne image ...
    en fait il s'agit d'un en-tête pour ma page moddb, normalement cela aurait du être une texture nodraw de 512*512, désolé !

    Merci pour cet extrait de code, je regarde tout ça !

  14. #14
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    La clé c'est ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *s = IMG_LoadTyped_RW(SDL_RWFromConstMem(file, file_size), 0, "jpg");
    SDL_RWFromConstMem crée une ressource SDL_RWops à partir d'une zone mémoire que tu ne veux pas changer.

    Ensuite on est obligé d'utiliser IMG_LoadTyped_RW au lieu de IMG_Load_RW, car SDL ne peut pas connaître l'extension du fichier vu que c'est chargé depuis la mémoire. Enfin le 0 veut dire qu'on ne va pas libérer la RWops, ici j'ai des doutes que crois qu'il vaut mieux le mettre à 1 (j'avais cru que libérer la RWops libèrerais la variable file qui est sur la pile, mais finalement je pense pas vu que c'est FromConstMem)

  15. #15
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut
    Et bien que dire ?
    Tout fonctionne parfaitement, j'ai pu supprimer mon image sans soucis de disque dur, le .h faisant le reste ! Merci beaucoup !

    coyotte507 > Sinon, j'avais noté que tu utilisais sdl_rwops, même si je n'en avais pas compris le fonctionnement. Ta technique fonctionne, mais elle m'a obligé à copier ma fonction de transformation des texture sdl ver sopengl dans ma fonction de chargement directement. Ce n'est pas trop un problème, cela fonctionne et ce n'est qu'une vingtaine de lignes supplémentaires. Je trouverais le temps plus tard d'optimiser cela.

    Sinon, que veut tu dires par :

    ici j'ai des doutes que crois qu'il vaut mieux le mettre à 1 (j'avais cru que libérer la RWops libèrerais la variable file qui est sur la pile, mais finalement je pense pas vu que c'est FromConstMem
    Il vaut mieux que je ne libère pas la mémoire non ? Puisque que je veux pouvoir y accéder chaque fois que j'ai une texture inexistante. Remarque, comme je fait un glgen, je l'ai aussi en mémoire à ce moment.

    Enfin bon, je vais quand même mettre tout cela en résolu. Merci beaucoup !
    (Notez que mon exécutable à pris du poids, et pas grand chose, 200ko supplémentaire, je préfère ça que de manger des crash et autres textures blanches !

  16. #16
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Ce que je veux dire, c'est que ta variable n'est pas allouée dynamiquement, elle est en dur, faire un free ou un delete[] sur cet emplacement mémoire causerait sans doute une erreur d'exécution.

    Après la question est de savoir si libérer la SDL_RWops créée de cette façon libère aussi l'emplacement du jpg, en fait non, donc met un 1 au lieu du 0

    Note que si tu veux détruire la variable de 200 ko, en fait, il suffit de la mettre dans une portée du code qui sera franchie.

    Ex:

    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
     int main(int argc, char **argv)
    {
        ...
     
        ...
     
        SDL_Surface *s;
     
        {
              #include "default.h"
     
              s = IMG_LoadTyped_RW(SDL_RWFromConstMem(file, file_size), 1, "jpg");
        } //Voilà, la variable de 200 ko allouée en dur est détruite, il ne reste plus que la surface allouée dynamiquement
     
         //faire qqchose avec s
    }

  17. #17
    Membre régulier Avatar de Froyok
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 83
    Points : 73
    Points
    73
    Par défaut
    Haaa, merci beaucoup !
    Et bah voilà, plus qu'a travailler mon chargement de niveaux !

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/12/2023, 03h40
  2. Réponses: 4
    Dernier message: 28/05/2006, 19h51
  3. Réponses: 3
    Dernier message: 22/01/2006, 17h57
  4. utiliser dev cpp pour debogger
    Par jeanfredd dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 28/09/2005, 17h30

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