【发布时间】:2014-05-11 12:22:51
【问题描述】:
我制作了自己的位图加载器。有一个函数可以从文件中加载数据。 它是 24 位的。
这是文件的十六进制数据:
42 4d 46 00 00 00 00 00 00 00 36 00 00 00 28 00
00 00 02 00 00 00 02 00 00 00 01 00 18 00 00 00
00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 ff ff ff ff 00 00 ff 00
00 00 ff 00 00 00
这是我的加载器(也将信息输出到文件):
void load_texture(std::string path)
{
std::ifstream f;
f.open(path, std::ios_base::binary);
std::vector<unsigned char> store;
char buf[255];
while(!f.eof())
{
unsigned char g;
f >> g;
store.push_back(g);
}
f.close();
std::ofstream l("info.txt");
int offset = store[0xA];
int width = store[0x12];
int height = store[0x16];
int sizeraw = ((width*3)*height)+height-1*2;
int a = store[(int)offset+1];
int pad = 0;
std::vector<BGR*> imageraw;
std::vector<int*> image;
for(int y = 0; y < height;y++)
{
for(int x = pad; x < pad + (width*3); x+=3)
{
imageraw.push_back(new BGR(store[offset +x], store[offset +x+1], store[offset +x+2]));
}
pad += (width*3)+2;
}
for(int i = 0; i < imageraw.size(); i++)
{
l << "---------------------------------\n";
image.push_back(new int(imageraw[i]->B));
image.push_back(new int(imageraw[i]->G));
image.push_back(new int(imageraw[i]->R));
l << "B : "; l << imageraw[i]->B; l << " \n";
l << "G : "; l << imageraw[i]->G; l << " \n";
l << "R : "; l << imageraw[i]->R; l << " \n";
}
glEnable(GL_TEXTURE_2D);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, image.data());
l.close();
}
这是 BGR 结构:
struct BGR
{
int B;
int G;
int R;
BGR(int a, int b, int c): B(a), G(b), R(c) {};
};
我不知道为什么,但是 OpenGL 以错误的颜色显示图像。 我还必须指出,我是在文件中处理十六进制数据的初学者。 此外,文件 (info.txt) 的输出是正确的。
为什么 OpenGL 会显示错误的颜色?
另外,我想给 OGL 的是 BGR 的整数值,就像 info.txt 中的值一样。没有十六进制也没有 bin。 编辑:
这是文件结果:
---------------------------------
B : 0
G : 0
R : 255
---------------------------------
B : 255
G : 255
R : 255
---------------------------------
B : 255
G : 0
R : 0
---------------------------------
B : 0
G : 255
R : 0
【问题讨论】:
-
while(!f.eof())不不不不不 -
@LightnessRacesinOrbit 这不是问题。我也试过while(f.good())。问题似乎更多是关于 OGL 而不是引擎本身,因为 info.txt 文件包含正确的信息。
-
不管怎样都是错的。您每次都会向
store添加一个额外的元素,其值未指定。while (f.good())有同样的问题。你在用哪本书? -
二进制文件不存储十六进制值。这只是一种表现形式。
-
@LightnessRacesinOrbit 我得到的文件输出是我想要的,但 Opengl 没有显示正确的颜色。请帮忙。我真的需要这个东西工作。
标签: c++ winapi opengl bitmap hex