Функция SDL для загрузки PNG

9

Сейчас я изучаю SDL 2.0, и я видел этот метод для загрузки 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;
}

Как я мог переключить это, чтобы загрузить файлы PNG?

РЕДАКТИРОВАТЬ: Woops, забыл добавить мой метод загрузки 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);
}

Я просто не хочу делать это для КАЖДОГО изображения. Так, как я мог поместить это в функцию?

Спасибо!

Коннор В
источник
Если у библиотеки нет собственного загрузчика PNG, вам придется либо написать свой собственный, либо использовать стороннюю библиотеку для загрузки. Мое чтение указывает мне, что SDL уже поддерживает png, libsdl.org/projects/SDL_image
Эван
Ой, извините, я забыл добавить метод, который я уже использую для загрузки PNG, но он не в функции. Я просто ищу короткий путь, поэтому мне не нужно делать это (смотрите в основном посте) для каждого отдельного изображения.
Коннор W
Вы серьезно спрашиваете, как написать функцию в C ++?
Тревор Пауэлл

Ответы:

11

Вы должны использовать API SDL_Image, он имеет одну простую функцию, которая загружает все:

SDL_Surface *IMG_Load(const char *file);

Точнее, он загружает форматы миниатюр ICO (значок) / CUR (курсор) / BMP, PNM (PPM / PGM / PBM), XPM, LBM (IFF ILBM), PCX, GIF, JPEG, PNG, TGA, TIFF и XV. ,

Он также имеет отдельные функции формата, такие как IMG_isPNGи IMG_LoadPNG_RW.

Я думаю, эта библиотека является одной из наиболее часто используемых для загрузки файлов изображений с помощью SDL.

Веб-сайт и документация

Benlitz
источник
Альтернативой является использование stb_image.h
Gustavo Maciel
4

Для загрузки файлов PNG с SDL необходимо иметь расширение библиотеки SDL_Image.

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

Описание этого расширения библиотеки:

«SDL_image - это библиотека загрузки файлов изображений. Она загружает изображения в виде поверхностей SDL и поддерживает следующие форматы: BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV».

TorbenC
источник
Да, простите, только что обновил основной пост, который должен помочь. Я знаю, как загрузить PNG, я просто ищу более простой способ сделать это.
Коннор W
1

SDL 2 SDL_image минимальный исполняемый пример

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 вверх по течению .

Скомпилируйте и запустите:

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

Результат:

введите описание изображения здесь

Протестировано на Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDL Image 2.0.1.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
источник
1
Обычно нам нравятся комментарии и / или описание того, что делает код, а не просто блок кода!
Vaillancourt
Кстати, это проще в использовании IMG_LoadTexture().
HolyBlackCat
1
@AlexandreVaillancourt Спасибо за отзыв. Философия здесь: 1) Этот код не требует пояснений 2) Также хорошо иметь что-то, что вы можете скопировать, вставить, и это просто работает, чтобы попробовать это. | Но дополнительное объяснение может быть третьей вещью, которая также должна быть добавлена.
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
@HolyBlackCat спасибо! Я искал онлайн-документы для текстур, но по какой-то причине это похоже на версию 1.x. Обновлено.
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功