PNGをロードするためのSDL関数


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ファイルをロードするように切り替えるにはどうすればよいですか?

編集:うーん、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を
Evan

ああ、申し訳ありませんが、PNGの読み込みに既に使用しているメソッドを追加するのを忘れていましたが、関数にはありません。私はショートカットを探しているだけなので、すべての画像に対してこれを行う必要はありません(メインポストを参照)。
Connor W

C ++で関数を記述する方法を真剣に求めていますか?
Trevor Powell

回答:


11

あなたはSDL_Image APIを使うべきです、それはすべてをロードする1つの単純な関数を持っています:

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ます。

このlibは、SDLでのイメージファイルのロードに最もよく使用されるライブラリの1つだと思います。

ウェブサイトドキュメント


別の方法は、stb_image.h
Gustavo Maciel

4

SDLでPNGファイルをロードするには、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の形式をサポートしています。」


ええ、申し訳ありませんが、メインの投稿を更新しました。PNGをロードする方法を知っています。単純な方法で探しています。
Connor 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でテスト済み。


1
一般に、コードのブロックだけでなく、コードの機能に関するコメントや説明が好きです。
ヴァイランクール

ところで、それは使いやすいIMG_LoadTexture()です。
HolyBlackCat 2017年

1
@AlexandreVaillancourtフィードバックありがとうございます。ここでの哲学:1)このコードは自明です2)コピーして貼り付けることができるものを用意するのも良いことです。| しかし、説明を追加することも、付加価値の3番目の要素になる可能性があります。
Ciro Santilli冠状病毒审查六四事件法轮功

@HolyBlackCatありがとう!テクスチャのオンラインドキュメントをgrepしていましたが、何らかの理由で1.xバージョン用のようです。更新しました。
Ciro Santilli冠状病毒审查六四事件法轮功
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.