Função SDL para carregar PNGs

9

Estou aprendendo SDL 2.0 no momento e já vi esse método para carregar BMPs:

SDL_Texture* LoadImage(std::string file)
{
    SDL_Surface *loadedImage = nullptr;
    SDL_Texture *texture = nullptr;
    loadedImage = SDL_LoadBMP(file.c_str());

    if (loadedImage != nullptr)
    {
        texture = SDL_CreateTextureFromSurface(renderer, loadedImage);
        SDL_FreeSurface(loadedImage);
    } 
    else
        std::cout << SDL_GetError() << std::endl;
        return texture;
}

Como eu poderia alternar para carregar arquivos PNG?

Edição: Woops, esqueci de adicionar o meu método de carregamento PNGs.

SDL_Texture* grass_image = nullptr;
grass_image = IMG_LoadTexture(renderer, "res/grass.bmp");
SDL_Rect grass_rect;
    grass_rect.x = 0;
    grass_rect.y = 0;
    grass_rect.w = SCREEN_WIDTH;
    grass_rect.h = SCREEN_HEIGHT;

if (grass_image == NULL)
    std::cout << "Couldn't load grass_image" << std::endl;

while (!quit && mainEvent -> type != SDL_Quit)
{
    SDL_RenderCopy(renderer, grass_image, NULL, &grass_rect);
}

Eu só não quero ter que fazer isso para cada imagem. Então, como eu poderia colocar isso em uma função?

Obrigado!

Connor W
fonte
Se a biblioteca não vier com seu próprio carregador PNG, você precisará escrever o seu próprio ou usar uma biblioteca de terceiros para carregá-lo. Minha leitura indica-me que SDL já suporta png, libsdl.org/projects/SDL_image
Evan
Desculpe, esqueci de adicionar o método que eu já uso para carregar PNGs, mas não está em uma função. Estou apenas procurando um atalho para não precisar fazer isso (procure no post principal) para cada imagem.
Connor W
Você está perguntando seriamente como escrever uma função em C ++?
Trevor Powell

Respostas:

11

Você deve usar a API SDL_Image, ela possui uma função simples que carrega tudo:

SDL_Surface *IMG_Load(const char *file);

Mais precisamente, ele carrega os formatos de miniatura ICO (Ícone) / CUR (Cursor) / BMP, PNM (PPM / PGM / PBM), XPM, LBM (IFF ILBM), PCX, GIF, JPEG, PNG, TMP, TIFF e XV .

Ele também possui funções de formato individual, como IMG_isPNGe IMG_LoadPNG_RW.

Essa biblioteca é uma das mais usadas para carregar arquivos de imagem com SDL, eu acho.

Site e documentação

Benlitz
fonte
Uma alternativa é usar stb_image.h
Gustavo Maciel
4

Para carregar arquivos PNG com SDL, é necessário ter a extensão da biblioteca SDL_Image.

http://www.libsdl.org/projects/SDL_image

Uma descrição desta extensão da biblioteca:

"SDL_image é uma biblioteca de carregamento de arquivos de imagem. Carrega imagens como superfícies SDL e suporta os seguintes formatos: BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV."

TorbenC
fonte
Sim, desculpe, apenas atualizei o post principal, isso deve ajudar as coisas. Eu sei como carregar um PNG, estou apenas procurando uma maneira mais simples de fazê-lo.
Connor W
1

SDL 2 SDL_image exemplo mínimo de executável

main.c

#include <stdlib.h>

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

int main(void) {
    SDL_Event event;
    SDL_Renderer *renderer = NULL;
    SDL_Texture *texture = NULL;
    SDL_Window *window = NULL;

    SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer(
        500, 500,
        0, &window, &renderer
    );
    IMG_Init(IMG_INIT_PNG);
    texture = IMG_LoadTexture(renderer, "flower.png");
    while (1) {
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
        if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
            break;
    }
    SDL_DestroyTexture(texture);
    IMG_Quit();
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return EXIT_SUCCESS;
}

GitHub upstream .

Compile e execute:

sudo apt-get install libsdl2-dev libsdl2-image-dev
gcc -std=c99 -o main -Wall -Wextra -pedantic main.c -lSDL2 -lSDL2_image
./main

Resultado:

insira a descrição da imagem aqui

Testado no Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDL Image 2.0.1.

Ciro Santilli adicionou uma nova foto
fonte
11
Geralmente gostamos de comentários e / ou descrição do que o código faz, não apenas um bloco de código!
Vaillancourt
Aliás, é mais fácil de usar IMG_LoadTexture().
precisa saber é o seguinte
11
@AlexandreVaillancourt Obrigado pelo feedback. Filosofia aqui: 1) Esse código é auto-explicativo 2) Também é bom ter algo que você pode copiar e colar e ele apenas funciona para testá-lo. | Mas mais explicações podem ser uma terceira coisa de valor a ser adicionada também.
Ciro Santilli respondeu
@HolyBlackCat thanks! Eu estava aguardando os documentos on-line por textura, mas parece ser para a versão 1.x por algum motivo. Atualizada.
Ciro Santilli respondeu