Chức năng SDL để tải PNG


9

Hiện tại tôi đang học SDL 2.0 và tôi đã thấy phương pháp này để tả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;
}

Làm cách nào tôi có thể chuyển nó lên để tải các tệp PNG?

EDIT: Rất tiếc, quên thêm phương pháp tải PNG của tôi.

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);
}

Tôi chỉ không muốn phải làm điều đó cho MỌI hình ảnh. Vì vậy, làm thế nào tôi có thể đặt nó vào một chức năng?

Cảm ơn!


Nếu thư viện không đi kèm với trình tải PNG của riêng nó thì bạn sẽ phải tự viết hoặc sử dụng thư viện của bên thứ 3 để tải nó. Việc đọc của tôi cho tôi biết rằng SDL đã hỗ trợ png, libsdl.org/projects/SDL_image
Evan

Ồ, xin lỗi, tôi đã quên thêm phương thức mà tôi đã sử dụng để tải PNG, nhưng nó không có trong một chức năng. Tôi chỉ tìm kiếm một đoạn ngắn vì vậy tôi không phải làm điều này (tìm trong bài chính) cho mỗi hình ảnh.
Connor W

Bạn có nghiêm túc hỏi làm thế nào để viết một hàm trong C ++ không?
Trevor Powell

Câu trả lời:


11

Bạn nên sử dụng API SDL_Image, nó có một chức năng đơn giản tải mọi thứ:

SDL_Surface *IMG_Load(const char *file);

Chính xác hơn, nó tải các định dạng hình thu nhỏ ICO (Biểu tượng) / CUR (Con trỏ) / BMP, PNM (PPM / PGM / PBM), XPM, LBM (IFF ILBM), PCX, GIF, JPEG, PNG, TGA, TIFF và XV .

Nó cũng có các chức năng định dạng cá nhân như IMG_isPNGIMG_LoadPNG_RW.

Lib này là một trong những phổ biến nhất được sử dụng để tải tập tin hình ảnh với SDL, tôi nghĩ vậy.

Trang webTài liệu


Một cách khác là sử dụng stb_image.h
Gustavo Maciel

4

Để tải các tệp PNG bằng SDL, bạn cần có phần mở rộng thư viện SDL_Image.

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

Mô tả về phần mở rộng thư viện này:

"SDL_image là thư viện tải tệp hình ảnh. Nó tải hình ảnh dưới dạng bề mặt SDL và hỗ trợ các định dạng sau: BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV."


YEah, xin lỗi, chỉ cần cập nhật bài viết chính, điều đó sẽ giúp mọi thứ. Tôi biết cách tải PNG Tôi chỉ tìm cách đơn giản hơn để làm điều đó.
Connor W

1

SDL 2 SDL_image ví dụ có thể chạy tối thiểu

C chính

#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 ngược dòng .

Biên dịch và chạy:

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

Kết quả:

nhập mô tả hình ảnh ở đây

Đã thử nghiệm trên Ubuntu 16.04, GCC 6.4.0, SDL 2.0.4, SDL Image 2.0.1.


1
Nói chung, chúng tôi thích bình luận và / hoặc mô tả về những gì mã làm, không chỉ là một khối mã!
Vaillancourt

Btw, nó dễ sử dụng hơn IMG_LoadTexture().
HolyBlackCat

1
@AlexandreVaillancourt Cảm ơn phản hồi. Triết lý ở đây: 1) Mã này là tự giải thích 2) Thật tốt khi có một cái gì đó mà bạn có thể sao chép dán và nó chỉ hoạt động để thử nó. | Nhưng giải thích thêm có thể là một điều thứ ba của giá trị được thêm vào là tốt.
Ciro Santilli 冠状 病毒 审查 事件

@HolyBlackCat cảm ơn! Tôi đã grepping các tài liệu trực tuyến cho kết cấu, nhưng nó dường như là cho phiên bản 1.x vì một số lý do. Cập nhật.
Ciro Santilli 冠状 病毒 审查 事件
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.