Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème, Erreur SDL_LoadBMP

Mon image en bmp ne veut pas s'ouvrir et je ne comprend pas pourquoi ?

    23 avril 2019 à 9:35:02

    Bonjour, je crée un programme assez simple mais mon image en bmp ne veut pas s'ouvrir avec la fonction SDL_LoadBMP. Pourriez vous y jeter un coup d'oeil car la ca doit faire 2 jours que je ne trouve rien...

    Merci a tous d'avance :)

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL2/SDL.h>
    
    
    int init(SDL_Window **window, SDL_Renderer **renderer, int w, int h)
    {
        if(0 != SDL_Init(SDL_INIT_VIDEO))
        {
            fprintf(stderr, "Erreur SDL_Init : %s", SDL_GetError());
            return -1;
        }
        if(0 != SDL_CreateWindowAndRenderer(w, h, SDL_WINDOW_SHOWN, window, renderer))
        {
            fprintf(stderr, "Erreur SDL_CreateWindowAndRenderer : %s", SDL_GetError());
            return -1;
        }
        return 0;
    }
    
    SDL_Texture *loadImage(const char path[], SDL_Renderer *renderer)
    {
        SDL_Surface *tmp = NULL;
        SDL_Texture *texture = NULL;
        tmp = IMG_Load(path);
        if(NULL == tmp)
        {
            fprintf(stderr, "Erreur SDL_LoadBMP : %s", SDL_GetError());
            return NULL;
        }
        texture = SDL_CreateTextureFromSurface(renderer, tmp);
        SDL_FreeSurface(tmp);
        if(NULL==texture)
        {
            fprintf(stderr, "Erreur SDL_CreateTextureFromSurface : %s", SDL_GetError());
            return NULL;
        }
        return texture;
    }
    
    int setWindowColor(SDL_Renderer *renderer, SDL_Color color)
    {
        if(SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a) < 0)
            return -1;
        if(SDL_RenderClear(renderer) < 0)
            return -1;
        return 0;
    }
    
    
    
    int main(int argc, char *argv)
    {
        SDL_Window *window = NULL;
        SDL_Renderer *renderer = NULL;
        SDL_Texture *image = NULL;
        int statut = EXIT_FAILURE;
        SDL_Color blanc = {255,255,255,255};
        if(0 != init(&window, &renderer, 800, 800))
            goto Quit;
        image = SDL_LoadBMP("image.bmp");
        if(NULL == image);
        {
            fprintf(stderr, "Erreur SDL_LoadBMP : %s", SDL_GetError());
            goto Quit;
        }
        statut = EXIT_SUCCESS;
        setWindowColor(renderer, blanc);
        SDL_RenderPresent(renderer);
        SDL_Delay(3000);
    
        Quit:
        if(NULL != image)
            SDL_DestroyTexture(image);
        if(NULL != renderer)
            SDL_DestroyRenderer(renderer);
        if(NULL != window)
            SDL_DestroyWindow(window);
        SDL_Quit();
        return statut;



    • Partager sur Facebook
    • Partager sur Twitter
      23 avril 2019 à 12:01:11

      Lu'

      Y a une erreur de donnée ? 

      • Partager sur Facebook
      • Partager sur Twitter
        23 avril 2019 à 12:44:23

        Salut,

        Quelle erreur obtiens-tu ? Ou veux-tu dire que l'image ne s'affiche pas ce qui est normal puisque tu ne l'affiches pas. ? Si c'est le cas, alors il ne faut pas juste suivre un tutoriel, mais aussi bien le comprendre et faire ses propres codes (tu sembles suivre le tutoriel de ZdS vu le code que tu donnes, mais dans ce code, il n'y a rien pour afficher la texture, mais normalement tu sais le faire avec SDL_RenderCopy).

        • Partager sur Facebook
        • Partager sur Twitter
        Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
          30 avril 2019 à 7:58:34

          Bonjour, merci pour votre aide et desole de mon temps pour repondre...

          Oui il y a une erreur, je l'affiche comme ca : Erreur SDL_LoadBMP : Surface doesn't have a colorkey

          Merci :)

          • Partager sur Facebook
          • Partager sur Twitter
            30 avril 2019 à 8:44:53

            Salut, ça marche avec un autre BMP ?

            Upload ton BMP quelque part, je soupçonne un autre format renommé.

            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

              30 avril 2019 à 9:20:37

              Salut,

              Le format de l'image est défini par IMG_Load() à partir des méta-données du fichier, un .BMP renommé en .PNG ou inversement sera quand-même ouvert correctement.

              Il y a fort à parier que l'erreur ne soit pas autre que celle affichée. Essaie de mettre :

              SDL_SetColorKey(tmp, SDL_FALSE, 0);
              

              juste après avoir chargé ta surface. Cela va définir une colorkey bidon (0,0,0) et la désactiver (SDL_FALSE), mais au moins elle sera définie.

              Sinon, utiliser IMG_LoadTexture() sera juste plus efficace, cela te garantie que la surface sera traitée comme il faut en interne avant d'être transformée en texture. Car oui, IMG_LoadTexture() passe également par une surface.

              Bonne continuation.

              • Partager sur Facebook
              • Partager sur Twitter

              Stringman | Jeux de plateforme : Nouvelle Démo. (màj : 16 Juin 2019)

                30 avril 2019 à 10:39:08

                Merci a vous, j'ai decide de reprendre a 0 en utilisant juste les connaissances apprise et en essayant pas de modifier leur code et etrangement, ca marche tout de suite mieux quand on comprend ce que l'on fait :D

                La paresse ne paie jamais, je vous envois le code que je viens de faire, il est largement optimisable alors si vous avez des conseils ou si vous voyez de grosses erreurs, n'hesiez pas a me le dire :)

                Mais merci a vous tous

                #include <stdio.h>
                #include <stdlib.h>
                #include <SDL2/SDL.h>
                #include <SDL2/SDL_image.h>
                
                
                
                
                int main(int argc, char* argv[])
                {
                    SDL_Window* window;
                    SDL_Renderer* renderer;
                    printf("Début du programme\n");
                
                    if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
                    {
                        printf("Problème d'initialisation :(\n");
                        return EXIT_FAILURE;
                    }
                    printf("SDL Initialisée :)\n");
                
                    
                    window = SDL_CreateWindow("Petit exemple pour le projet info", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 800, SDL_WINDOW_SHOWN);
                    if(window == 0)
                    {
                        printf("Problème création de la fenêtre :(\n");
                        return EXIT_FAILURE;
                    }
                    printf("Fenêtre créée :)\n");
                    renderer = SDL_CreateRenderer(window, -1, 0);
                    if(renderer == 0)
                    {
                        printf("Problème d'initialisation du renderer:(\n");
                        return EXIT_FAILURE;
                    }
                    printf("Initialisation terminée\n");
                
                    SDL_SetRenderDrawColor(renderer, 0, 200, 200, 255);
                    SDL_RenderClear(renderer);
                
                
                
                    SDL_Texture  *menu;
                	SDL_Rect rect1;
                
                	SDL_Surface *MENU = NULL;
                	MENU=IMG_Load("menu.png");
                
                	if(!MENU)
                	{
                		printf("IMG_Load: %s\n", IMG_GetError());
                	}
                
                	menu = SDL_CreateTextureFromSurface(renderer, MENU);
                	SDL_FreeSurface(MENU);
                
                	rect1.x = 0;
                	rect1.y = 0;
                	rect1.w = rect1.h = 800;
                	SDL_RenderCopy(renderer, menu, NULL, &rect1); 
                
                
                
                    SDL_RenderPresent(renderer); 
                    SDL_Delay(50); 
                
                    SDL_Event event;
                    SDL_bool quit = SDL_FALSE;
                    int x , y;
                    Uint32 boutons;
                
                
                
                
                    while(!quit)
                    {
                        SDL_WaitEvent(&event);
                        if(event.type == SDL_QUIT)
                            quit = SDL_TRUE;
                        boutons = SDL_GetMouseState( &x, &y);
                        if(x>100 &&x<700 && y>100 && y<200 && event.button.button == SDL_BUTTON(SDL_BUTTON_LEFT))
                        {
                            SDL_SetRenderDrawColor(renderer, 0, 200, 200, 255);
                            SDL_RenderClear(renderer);
                            SDL_Texture  *menu;
                
                            SDL_Surface *MENU = NULL;
                            MENU=IMG_Load("Test.jpg");
                
                            if(!MENU)
                            {
                                printf("IMG_Load: %s\n", IMG_GetError());
                            }
                
                            menu = SDL_CreateTextureFromSurface(renderer, MENU);
                            SDL_FreeSurface(MENU);
                
                            rect1.x = 0;
                            rect1.y = 0;
                            rect1.w = rect1.h = 800;
                            SDL_RenderCopy(renderer, menu, NULL, &rect1);
                
                
                
                            SDL_RenderPresent(renderer);
                            SDL_Delay(5000);
                            quit = SDL_TRUE;
                
                        }
                        if(x>200 &&x<600 && y>250 && y<350 && event.button.button == SDL_BUTTON(SDL_BUTTON_LEFT))
                            quit = SDL_TRUE;
                        if(x>200 &&x<600 && y>450 && y<550 && event.button.button == SDL_BUTTON(SDL_BUTTON_LEFT))
                            quit = SDL_TRUE;
                        if(x>100 &&x<700 && y>600 && y<700 && event.button.button == SDL_BUTTON(SDL_BUTTON_LEFT))
                            quit = SDL_TRUE;
                
                    }
                
                    SDL_Event event2;
                    SDL_bool quit2 = SDL_FALSE;
                
                    while(!quit2)
                    {
                        SDL_WaitEvent(&event2);
                        if(event2.type == SDL_QUIT)
                        quit2 = SDL_TRUE;
                        if(x>100 &&x<700 && y>600 && y<700 && event.button.button == SDL_BUTTON(SDL_BUTTON_LEFT))
                        {
                            retour = 1;
                            quit = SDL_TRUE;
                        }
                
                
                    }
                    if (retour == 1)
                
                
                
                
                
                
                
                    printf("Fermeture SDL\n");
                    SDL_Quit();
                    printf("Fin du programme\n");
                
                    return EXIT_SUCCESS;
                }
                



                -
                Edité par GurvanPincepoche 30 avril 2019 à 10:43:01

                • Partager sur Facebook
                • Partager sur Twitter
                  30 avril 2019 à 11:22:14

                  Ok ?

                  Mais je ne vois pas trop la différence à part que c'est pire et que tu as changé d'image à charger.

                  Déjà, on ne charge JAMAIS une ressource dans la boucle principale d'un programme sauf si ça n'impacte pas l'exécution (selon le type de soft)... Mais surtout pas pour la charger et ne pas la libérer à chaque boucle.

                  Même si la boucle est inutile ici puisque quit est passé à la valeur vrai dans tous les cas, donc ça ne bouclera jamais.

                  Bonne continuation.

                  EDIT : Je n'ai rien dit, j'ai lu trop vite... Au temps pour moi.

                  -
                  Edité par drx 30 avril 2019 à 11:26:56

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Stringman | Jeux de plateforme : Nouvelle Démo. (màj : 16 Juin 2019)

                  Problème, Erreur SDL_LoadBMP

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown