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!


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


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."


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.