はい。 http://wiki.libsdl.org/SDL_PixelFormat#Code_Examples
サイトから:
SDL_PixelFormat *fmt;
SDL_Surface *surface;
Uint32 temp, pixel;
Uint8 red, green, blue, alpha;
.
.
.
fmt = surface->format;
SDL_LockSurface(surface);
pixel = *((Uint32*)surface->pixels);
SDL_UnlockSurface(surface);
/* Get Red component */
temp = pixel & fmt->Rmask; /* Isolate red component */
temp = temp >> fmt->Rshift; /* Shift it down to 8-bit */
temp = temp << fmt->Rloss; /* Expand to a full 8-bit number */
red = (Uint8)temp;
あなたは値によってXmasksを並べ替えることができる必要があり、以下のリンクは、各コンポーネントのチャネルシフトを決定する方法のコード例を持っています。次に、RGBAかBGRAかを判断することができます。 Xmask == 0の場合、カラーチャンネルは存在しません。
スワップがなぜ発生するのかわかりません。
編集:XshiftからXmaskへの変更は、カラーチャンネルの位置と存在の両方を判断するために使用されるため、変更されました。
私は答えを投稿しようとしていましたが、私は解決策の大きな部分を失っていることに気付きました。基本的にBGRAは、多くのシステムで符号なし8ビットの正規化テクスチャに優先されます。他のタイプではRGBAが使用される傾向があります。しかし、SDL_Imageにどのような形式で出力するかを尋ねる方法を見つけることができませんでした。これは、OpenGLに伝える内容と一致するかどうかを判断する重要な要素です。しかし、今日では、おそらくあなたが合理的なシステムにロードする画像は、BGRAの注文になるでしょう。 HDRファイルの場合、RGBAまたはARGBがポップアップすることがあります。 –