无法加载SDL2 png图片

时间:2018-09-30 09:52:32

标签: c sdl-2

我为C和C ++尝试了许多(超过10个)SDL2示例文件,这些文件加载​​图像,而任何尝试加载png的文件均失败。

下面的C代码与我发现的代码一样简单,而且注释也很好,并且存在相同的问题。

该代码适用于bmp图片 ,但不适用于 png文件 。 (我正在使用minGW从win7批处理文件进行编译。

此行在使用.png时导致错误,但适用于bmp ...
SDL_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可以动态地找出这一点),但是强烈建议使用它,因为它有助于捕获错误,在这种情况下很有用。因此,我将其保留在此代码清单中。

我不能很快使用论坛,但是四天后我才不知道是什么原因引起的。

感谢所有帮助:)

0 个答案:

没有答案