为什么我无法初始化SDL_image?

时间:2020-07-20 17:24:44

标签: c sdl sdl-2

这是更新的帖子。有人要求我做一个最小的可复制示例,这确实有很大帮助。该程序会打开一个窗口,但不会像我希望的那样显示PNG图像。

编译器没有给我任何错误,但是我的SDL_Init错误消息却没有。

我无法初始化SDL_Image的原因可能是什么?

// std
#include <stdio.h>

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

int main (int argc, char* argv[])
{
    // ----- Initialize SDL
    if (SDL_Init(SDL_INIT_VIDEO) != 0)
    {
        fprintf(stderr, "SDL could not initialize\n");
        return 1;
    }
    if (IMG_Init(IMG_INIT_PNG) != 0)
    {
        fprintf(stderr, "SDL_image could not initialize\n");
        /********
        I GET THIS ERROR
        ********/
    }

    // ----- Create window
    SDL_Window* window = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED,
                                                    SDL_WINDOWPOS_CENTERED,
                                                    800,
                                                    600, 
                                                    0);
    if (!window)
    {
        fprintf(stderr, "Error creating window.\n");
        return 2;
    }

    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

    SDL_Surface *image_surface = NULL;
    image_surface = IMG_Load("button_randomize.png");
    if(image_surface == NULL)
    {
        printf("Cannot find image\n"); // This line is not executed
        SDL_Quit();
    }
    SDL_Texture *image_texture = SDL_CreateTextureFromSurface(renderer, image_surface);
    SDL_FreeSurface(image_surface);

    // ----- Main loop
    int quit = 0;
    while (quit == 0)
    {
        SDL_Event windowEvent;
        while (SDL_PollEvent(&windowEvent))
        {
            if (windowEvent.type == SDL_QUIT)
            {
                quit = 1;
                break;
            }
        }

        SDL_Rect image_rect = {50, 50, 120, 32};
        SDL_RenderCopy(renderer, image_texture, NULL, &image_rect);
    }

    // ----- Clean up
    IMG_Quit();
    SDL_Quit();
    return 0;
}

输出:

SDL_image could not initialize

构建命令:

gcc -std=c11 -Wall -o obj/main.o -c src/main.c
gcc -std=c11 -Wall -o my_program obj/main.o -lSDL2 -lGL -lGLEW -lm -lSDL2_image

我尝试更改SDL_Init标志。我什至尝试将IMG_Init标志更改为IMG_INIT_JPG(当然还要使用.jpg图像进行测试),但是没有运气。

1 个答案:

答案 0 :(得分:2)

此示例中有两个问题:

  • IMG_Init()成功返回所有当前已初始化的图像加载器的位掩码,而不是0(这就是为什么收到错误消息的原因)
  • 在渲染器上绘制后,您不会调用SDL_RenderPresent()(这就是为什么您看不到任何东西的原因)

以下是有关如何从SDL2_image documentation初始化SDL_Image的示例:

// 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_RenderPresent(renderer);