Fonction SDL pour le chargement de fichiers PNG


9

J'apprends SDL 2.0 en ce moment et j'ai vu cette méthode pour charger des 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;
}

Comment pourrais-je le changer pour charger des fichiers PNG?

EDIT: Woops, j'ai oublié d'ajouter ma méthode de chargement des fichiers 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);
}

Je ne veux juste pas avoir à faire ça pour CHAQUE image. Alors, comment pourrais-je mettre cela dans une fonction?

Merci!


Si la bibliothèque ne vient pas avec son propre chargeur PNG, vous devrez soit écrire le vôtre, soit utiliser une bibliothèque tierce pour le charger. Ma lecture m'indique que SDL prend déjà en charge png, libsdl.org/projects/SDL_image
Evan

Oh, désolé d'avoir oublié d'ajouter la méthode que j'utilise déjà pour charger les PNG, mais ce n'est pas dans une fonction. Je cherche juste un raccourci donc je n'ai pas à le faire (regardez dans le post principal) pour chaque image.
Connor W

Vous demandez-vous sérieusement comment écrire une fonction en C ++?
Trevor Powell

Réponses:


11

Vous devez utiliser l'API SDL_Image, elle a une fonction simple qui charge tout:

SDL_Surface *IMG_Load(const char *file);

Plus précisément, il charge les formats de vignettes ICO (Icon) / CUR (Cursor) / BMP, PNM (PPM / PGM / PBM), XPM, LBM (IFF ILBM), PCX, GIF, JPEG, PNG, TGA, TIFF et XV. .

Il a également des fonctions de format individuelles telles que IMG_isPNGet IMG_LoadPNG_RW.

Cette bibliothèque est l'une des plus utilisées pour le chargement de fichiers image avec SDL, je pense.

Site Web et documentation


Une alternative consiste à utiliser stb_image.h
Gustavo Maciel

4

Pour charger des fichiers PNG avec SDL, vous devez avoir l'extension de bibliothèque SDL_Image.

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

Une description de cette extension de bibliothèque:

"SDL_image est une bibliothèque de chargement de fichiers image. Elle charge les images en tant que surfaces SDL et prend en charge les formats suivants: BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV."


Oui, désolé, je viens de mettre à jour le message principal, cela devrait aider les choses. Je sais comment charger un PNG. Je cherche simplement un moyen plus simple de le faire.
Connor W

1

Exemple exécutable minimal de SDL_image SDL 2

principal 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 en amont .

Compiler et exécuter:

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

Résultat:

entrez la description de l'image ici

Testé sur Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDL Image 2.0.1.


1
Généralement, nous aimons les commentaires et / ou la description de ce que fait le code, pas seulement un bloc de code!
Vaillancourt

Btw, c'est plus facile à utiliser IMG_LoadTexture().
HolyBlackCat

1
@AlexandreVaillancourt Merci pour vos commentaires. La philosophie ici: 1) Ce code était explicite 2) Il est également bon d'avoir quelque chose que vous pouvez copier coller et cela fonctionne juste pour l'essayer. | Mais des explications supplémentaires pourraient également être une troisième valeur ajoutée.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

@HolyBlackCat merci! J'étais en train de saluer les documents en ligne pour la texture, mais cela semble être pour la version 1.x pour une raison quelconque. Mise à jour.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.