18

実行時に使用できるSDLを使用してプログラム内に画像を埋め込むことは可能ですか?

たとえば、起動時にロゴと著作権情報を含むスプラッシュ画面を表示するプログラムがあります。この画像をビットマップ ファイルに保存し、SDL_LoadBMP を使用して SDL_Surface に読み込むのではなく。誰かがスプラッシュ画像と著作権名を変更する可能性を阻止するために、画像をプログラム バイナリに埋め込んでおきたいと思います。

これを行う方法について何か提案はありますか?サンプルコードは素晴らしいでしょう。

4

3 に答える 3

18

実行可能ファイルにファイルを埋め込むのは簡単ですが、いくつかの落とし穴があり、いくつかの移植可能な方法と移植不可能な方法を含むいくつかの方法があります。

イメージを C コードに変換する

画像を定数配列に変換するスクリプトを C で記述します。スクリプトは Python では次のようになります。

#!/usr/bin/env python3
print("static const unsigned char IMAGE_DATA[] = {{{}}};".format(
        ",".join(str(b) for b in open("myimage.bmp", "rb").read())))

出力をファイルにパイプし、*.hそのファイルを別のファイルからインクルードするだけです。でファイルのサイズを取得できますsizeof(IMAGE_DATA)

利点: ポータブル

短所: Python をインストールする必要がある、コンパイラに対して配列が大きすぎる場合は機能しない、ビルド システムにカスタム ステップを追加する必要がある

画像をオブジェクトファイルに変換

これは、よりプラットフォームに依存します。GNU binutils ツールチェーン (Linux など) を使用できるプラットフォームでは、Microsoft ツールチェーンで動作するobjcopyと思います。bin2obj

メリット:どこでも使える

短所: 移植性がない、カスタム ステップをビルド システムに追加する必要がある、カスタム ステップを正しく行うのが難しい場合がある

GNU binutils ツールチェーンでは、objcopy を使用

objcopyプログラムでは入力形式として指定できますがbinary、アーキテクチャを明示的に指定する必要があります...そのため、実行可能ファイルの i386 および x64 バージョンのコマンドを変更する必要があります。

$ objcopy --input binary --output elf32-i386 --binary-architecture i386 \
    myimage.bmp myimage.o

次の宣言を使用して、C からデータを取得できます。

// Ignore the fact that these are char...
extern char _binary_myimage_bmp_start, _binary_myimage_bmp_end;

#define MYIMAGE_DATA ((void *) &_binary_myimage_bmp_start)
#define MYIMAGE_SIZE \
    ((size_t) (&_binary_myimage_bmp_end - &_binary_myimage_bmp_start))

アセンブラ ディレクティブを使用する

逆説的に、静的ファイルの埋め込みはアセンブラーではかなり簡単です。アセンブラーには、.incbin(GAS と YASM で動作する) のようなディレクティブがあることがよくあります。

メリット:どこでも使える

短所: 移植性がなく、アセンブラーの構文がプラットフォーム間で異なる

(Windows) ファイルをリソースとして埋め込む

Windows では、リソースを EXE に埋め込んでから、ライブラリ呼び出しを使用してリソースを取得できます。

利点: Windows を使用している場合はおそらく最も簡単です

短所: Windows でしか動作しない

于 2013-08-24T19:41:59.593 に答える
1

gimp を使用すると、画像を C コードとして保存できます。

于 2013-08-24T20:08:02.663 に答える