SDL2 png изображение не загружается - PullRequest
0 голосов
/ 30 сентября 2018

Я перепробовал много (более 10) примеров файлов SDL2 для C & C ++, которые загружают образы, и любой, который пытается загрузить png, терпит неудачу.

Приведенный ниже код C примерно настолько же прост и хорошо прокомментирован, насколько я могу найти, и у него та же проблема.

Код отлично работает с изображениями bmp , но не будет работать для png файла .(Я компилирую из командного файла win7, используя minGW.

Эта строка вызывает ошибку при использовании .png, но работает для bmp ...
SDL_Surface * surface = IMG_Load ("smile.bmp");

Полный список кодов

    #include <stdio.h>
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_image.h>

    int main(int argc, char* args[])
    {
      // attempt to initialize graphics and timer system
      if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
      {
        printf("error initializing SDL: %s\n", SDL_GetError());
        getchar(); // show error message, hit any key to quit
        return 1;  // return error value
      }

// load support for the JPG and PNG image formats
int flags=IMG_INIT_JPG|IMG_INIT_PNG;
int initted=IMG_Init(flags);
if((initted&flags) != flags) {
    printf("IMG_Init: Failed to init required jpg and png support!\n");
    printf("IMG_Init: %s\n", IMG_GetError());
    // handle error
}

      SDL_Window* win = SDL_CreateWindow("SDL2 image library test",
                                         SDL_WINDOWPOS_CENTERED,
                                         SDL_WINDOWPOS_CENTERED,
                                         400, 400, 0);
      if (!win)
      {
        printf("error creating window: %s\n", SDL_GetError());
        getchar(); // show error message, hit any key to quit
        SDL_Quit();
        return 1; // return error value
      }

      // print video card drivers
      SDL_RendererInfo info;
        int cnt, iDrivers;
        iDrivers = SDL_GetNumRenderDrivers();
        while ( cnt < iDrivers )
        {
          if ( SDL_GetRenderDriverInfo(cnt,&info) == 0 )
          {
            printf("%s\n",info.name);
          }
          cnt++;
        }  


      // create a renderer, which sets up the graphics hardware
      Uint32 render_flags = SDL_RENDERER_PRESENTVSYNC | IMG_INIT_JPG | IMG_INIT_PNG;
      SDL_Renderer* rend = SDL_CreateRenderer(win, -1, render_flags);
      if (!rend)
      {
        printf("error creating renderer: %s\n", IMG_GetError());
        getchar(); // show error message, hit any key to quit
        SDL_DestroyWindow(win);
        SDL_Quit();
        return 1; // return error value
      }

      // load the image into ram memory using SDL_image library function
      SDL_Surface* surface = IMG_Load("smile.png");
      if (!surface)
      {
        printf("error creating surface: %s \n", SDL_GetError());
        getchar(); // show error message, hit any key to quit
        SDL_DestroyRenderer(rend);
        SDL_DestroyWindow(win);
        SDL_Quit();
        return 1; // return error value
      }

      // load the image data into the graphics hardware's memory
      SDL_Texture* tex = SDL_CreateTextureFromSurface(rend, surface);
      SDL_FreeSurface(surface);
      if (!tex)
      {
        printf("error creating texture: %s\n", SDL_GetError());
        getchar(); // show error message, hit any key to quit
        SDL_DestroyRenderer(rend);
        SDL_DestroyWindow(win);
        SDL_Quit();
        return 1;
      }

      SDL_RenderClear(rend);       // clear the window

      SDL_RenderCopy(rend, tex, NULL, NULL); // draw the image to the window
      SDL_RenderPresent(rend);

      SDL_Delay(10000);           // pause 10 seconds before quitting

      SDL_DestroyTexture(tex);    // clean up resources before exiting
      SDL_DestroyRenderer(rend);
      SDL_DestroyWindow(win);
      SDL_Quit();
      return 0;                   // return success value
    }

ОБНОВЛЕНИЕ

[решено] С помощью многих участников, приведенных ниже, я смог в конечном итоге почувствовать уверенность вПрограмма была правильной, и у меня была какая-то проблема с установкой. После хорошего ночного сна я скачал и перезагрузил mingw, SDL2_image и zlib , убедившись, что я использовал 64-битные версии. Я рад сообщить, что проблема исчезла.

Чтобы помочь кому-либо в будущем, код инициализации

int flags=IMG_INIT_JPG|IMG_INIT_PNG;
int initted=IMG_Init(flags);

рекомендуется «Roger Rapid & Keltar» не является абсолютно необходимым (SDL2 может понять это динамически), но иметь его настоятельно рекомендуется, потому что это помогает отлавливать ошибки, что было полезно в этом случае. По этой причине я оставил его в этом коделистинг.

Iя не быстро пользуюсь форумами, но через 4 дня у меня просто не было подсказки, что может быть причиной проблемы.

Спасибо за помощь:)

...