Fungsi SDL untuk Memuat PNG

9

Saya sedang belajar SDL 2.0 saat ini dan saya telah melihat metode ini untuk memuat 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;
}

Bagaimana saya bisa mengaktifkannya untuk memuat file PNG?

EDIT: Woops, lupa menambahkan metode saya memuat 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);
}

Saya hanya tidak mau harus melakukan itu untuk SETIAP gambar. Jadi bagaimana saya bisa menjalankannya?

Terima kasih!

Connor W
sumber
Jika perpustakaan tidak datang dengan PNG loader sendiri maka Anda harus menulis sendiri, atau menggunakan perpustakaan pihak ke-3 untuk memuatnya. Bacaan saya menunjukkan kepada saya bahwa SDL sudah mendukung png, libsdl.org/projects/SDL_image
Evan
Oh, maaf saya lupa menambahkan metode yang sudah saya gunakan untuk memuat PNG, tapi itu tidak berfungsi. Saya hanya mencari jalan pintas jadi saya tidak perlu melakukan ini (lihat di posting utama) untuk setiap gambar.
Connor W
Apakah Anda serius bertanya bagaimana menulis fungsi dalam C ++?
Trevor Powell

Jawaban:

11

Anda harus menggunakan SDL_Image API, ia memiliki satu fungsi sederhana yang memuat semuanya:

SDL_Surface *IMG_Load(const char *file);

Lebih tepatnya, ini memuat ICO (Ikon) / CUR (Kursor) / BMP, PNM (PPM / PGM / PBM), XPM, LBM (IFF ILBM), PCX, GIF, JPEG, PNG, TGA, TIFF, dan format thumbnail XV .

Ini juga memiliki fungsi format individual seperti IMG_isPNGdan IMG_LoadPNG_RW.

Lib ini adalah salah satu yang paling umum digunakan untuk memuat file gambar dengan SDL, saya pikir.

Situs web dan Dokumentasi

Benlitz
sumber
Alternatifnya adalah menggunakan stb_image.h
Gustavo Maciel
4

Untuk memuat file PNG dengan SDL Anda harus memiliki ekstensi perpustakaan SDL_Image.

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

Deskripsi ekstensi perpustakaan ini:

"SDL_image adalah pustaka pemuatan file gambar. Ini memuat gambar sebagai permukaan SDL, dan mendukung format berikut: BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV."

TorbenC
sumber
Ya, maaf, baru saja memperbarui posting utama, yang seharusnya membantu. Saya tahu cara memuat PNG. Saya hanya mencari cara yang lebih sederhana untuk melakukannya.
Connor W
1

SDL 2 SDL_image contoh runnable minimal

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 hulu .

Kompilasi dan jalankan:

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

Hasil:

masukkan deskripsi gambar di sini

Diuji pada Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDL Image 2.0.1.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
sumber
1
Secara umum kami menyukai komentar dan / atau deskripsi tentang apa yang dilakukan kode, bukan hanya blok kode!
Vaillancourt
Btw, lebih mudah digunakan IMG_LoadTexture().
HolyBlackCat
1
@AlexandreVaillancourt Terima kasih atas umpan baliknya. Filsafat di sini: 1) Kode ini cukup jelas. 2) Juga baik untuk memiliki sesuatu yang dapat Anda salin dan hanya berfungsi untuk mencobanya. | Tetapi lebih banyak penjelasan bisa menjadi hal ketiga yang bernilai untuk ditambahkan juga.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
@HolyBlackCat terima kasih! Saya sedang mencari dokumen online untuk tekstur, tetapi tampaknya untuk versi 1.x untuk beberapa alasan. Diperbarui.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功