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.