リンクしたコードの主な問題は、OpenGL とは関係なく、画像の読み込みとは関係ありません。問題は、ファイルからコンテンツをロードする方法が信頼できないことです。たとえば、次のようにします。
// read the width
if ((i = fread(&image->sizeX, 4, 1, file)) != 1) {
printf("Error reading width from %s.\n", filename);
return 0;
}
ここでの問題は、sizeof(Image::sizeX)
必ずしも 4 つの「文字」ではないことです。タイプはunsigned long
少なくとも4ですが、それよりも長くなる可能性があります。そして、最新のシステムでは 8 である可能性が非常に高いです。つまり、8 つの「文字」のうち 4 つは、読み取り前の状態のままであり、通常のケアではゼロ以外のガベージです。
また、エンディアンの問題全体は解決されていません。堅牢なバイナリ読み込みを実装する唯一の方法は、適切に定義された式からの代入によってすべてのビットを明示的に設定することです。フィールドの場合、次のImage::sizeX
ように書くことができます
char buf[4];
// read the width
if ((i = fread(buf, 4, 1, file)) != 1) {
printf("Error reading width from %s.\n", filename);
return 0;
}
image->sizeX =
((unsigned long)buf[0]) |
(((unsigned long)buf[1])<<8) |
(((unsigned long)buf[2])<<16)|
(((unsigned long)buf[3])<<24);
このように記述することは、堅牢でプラットフォームに依存しない方法でバイナリ データを読み取る唯一の方法です。書くのは面倒ですか?はい、そうです。そのため、これを抽象化するためにいくつかのヘルパー関数を作成する必要があります。