Funzione SDL per caricamento PNG


9

Sto imparando SDL 2.0 al momento e ho visto questo metodo per caricare i 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;
}

Come ho potuto cambiarlo per caricare i file PNG?

EDIT: Woops, ho dimenticato di aggiungere il mio metodo di caricamento dei 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);
}

Non voglio proprio farlo per OGNI immagine. Quindi, come potrei metterlo in una funzione?

Grazie!


Se la libreria non viene fornita con il proprio caricatore PNG, è necessario scrivere la propria o utilizzare una libreria di terze parti per caricarla. La mia lettura mi indica che SDL supporta già png, libsdl.org/projects/SDL_image
Evan

Oh, scusami ho dimenticato di aggiungere il metodo che già uso per caricare i PNG, ma non è in una funzione. Sto solo cercando una scorciatoia, quindi non devo farlo (cerca nel post principale) per ogni singola immagine.
Connor W,

Stai chiedendo seriamente come scrivere una funzione in C ++?
Trevor Powell,

Risposte:


11

Dovresti usare l'API SDL_Image, ha una semplice funzione che carica tutto:

SDL_Surface *IMG_Load(const char *file);

Più precisamente, carica i formati di anteprima ICO (Icona) / CUR (Cursore) / BMP, PNM (PPM / PGM / PBM), XPM, LBM (IFF ILBM), PCX, GIF, JPEG, PNG, TGA, TIFF e XV .

Ha anche funzioni di formato individuali come IMG_isPNGe IMG_LoadPNG_RW.

Questa lib è una delle più comunemente usate per il caricamento di file immagine con SDL, credo.

Sito Web e documentazione


Un'alternativa è usare stb_image.h
Gustavo Maciel il

4

Per caricare i file PNG con SDL è necessario disporre dell'estensione della libreria SDL_Image.

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

Una descrizione di questa estensione di libreria:

"SDL_image è una libreria di caricamento di file di immagini. Carica immagini come superfici SDL e supporta i seguenti formati: BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV."


Sì, scusa, ho appena aggiornato il post principale, che dovrebbe aiutare le cose. So come caricare un PNG Sto solo cercando un modo più semplice per farlo.
Connor W,

1

SDL 2 SDL_image esempio eseguibile minimo

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 a monte .

Compila ed esegui:

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

Risultato:

inserisci qui la descrizione dell'immagine

Testato su Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDL Image 2.0.1.


1
In genere ci piacciono i commenti e / o la descrizione di ciò che fa il codice, non solo un blocco di codice!
Vaillancourt

A proposito, è più facile da usare IMG_LoadTexture().
HolyBlackCat

1
@AlexandreVaillancourt Grazie per il feedback. Filosofia qui: 1) Questo codice era autoesplicativo 2) È anche bello avere qualcosa che puoi copiare e incollare e funziona solo per provarlo. | Ma ulteriori spiegazioni potrebbero essere una terza cosa di valore da aggiungere.
Ciro Santilli 17 病毒 审查 六四 事件 法轮功

@HolyBlackCat grazie! Stavo afferrando i documenti online per la trama, ma per qualche motivo sembra che fosse la versione 1.x. Aggiornato.
Ciro Santilli 17 病毒 审查 六四 事件 法轮功
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.