Función SDL para cargar PNG

9

Estoy aprendiendo SDL 2.0 en este momento y he visto este método para cargar BMP:

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;
}

¿Cómo podría cambiarlo para cargar archivos PNG?

EDITAR: Woops, olvidé agregar mi método de carga de PNG.

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);
}

Simplemente no quiero tener que hacer eso para CADA imagen. Entonces, ¿cómo podría poner eso en una función?

¡Gracias!

Connor W
fuente
Si la biblioteca no viene con su propio cargador PNG, entonces tendría que escribir la suya propia o usar una biblioteca de terceros para cargarla. Mi lectura me indica que SDL ya es compatible con png, libsdl.org/projects/SDL_image
Evan
Oh, lo siento, olvidé agregar el método que ya uso para cargar PNG, pero no está en una función. Solo estoy buscando un atajo para no tener que hacer esto (mira en la publicación principal) para cada imagen.
Connor W
¿En serio te preguntas cómo escribir una función en C ++?
Trevor Powell

Respuestas:

11

Debe usar SDL_Image API, tiene una función simple que carga todo:

SDL_Surface *IMG_Load(const char *file);

Más precisamente, carga ICO (Icon) / CUR (Cursor) / BMP, PNM (PPM / PGM / PBM), XPM, LBM (IFF ILBM), PCX, GIF, JPEG, PNG, TGA, TIFF y XV. .

También tiene funciones de formato individual como IMG_isPNGy IMG_LoadPNG_RW.

Creo que esta lib es una de las más utilizadas para cargar archivos de imágenes con SDL.

Sitio web y documentación

Benlitz
fuente
Una alternativa es usar stb_image.h
Gustavo Maciel
4

Para cargar archivos PNG con SDL, debe tener la extensión de biblioteca SDL_Image.

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

Una descripción de esta extensión de biblioteca:

"SDL_image es una biblioteca de carga de archivos de imagen. Carga imágenes como superficies SDL y admite los siguientes formatos: BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV".

TorbenC
fuente
Sí, lo siento, acabo de actualizar la publicación principal, eso debería ayudar a las cosas. Sé cómo cargar un PNG. Solo estoy buscando una forma más sencilla de hacerlo.
Connor W
1

SDL 2 SDL_image ejemplo ejecutable mínimo

C Principal

#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 aguas arriba .

Compilar y ejecutar:

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

Salir:

ingrese la descripción de la imagen aquí

Probado en Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDL Image 2.0.1.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
fuente
1
En general, nos gustan los comentarios y / o la descripción de lo que hace el código, ¡no solo un bloque de código!
Vaillancourt
Por cierto, es más fácil de usar IMG_LoadTexture().
HolyBlackCat
1
@AlexandreVaillancourt Gracias por sus comentarios. Filosofía aquí: 1) Este código se explica por sí mismo 2) También es bueno tener algo que pueda copiar y pegar y simplemente funciona para probarlo. El | Pero una mayor explicación podría ser una tercera cosa de valor para agregar también.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
@HolyBlackCat gracias! Estaba buscando los documentos en línea para obtener textura, pero por alguna razón parece ser para la versión 1.x. Actualizado.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功