Я только начал создавать загрузчик изображений растрового изображения и только из вики, я заключил смещение с начала файла, чтобы данные изображения составляли 50 байт. Для этого, я установил данные на 50. Вот оригинальное изображение:Снимки данных изображения растровых изображений, производящие различное изображение
Теперь, когда я загрузить изображение со следующим кодом:
std::fstream file;
file.open(fileName, std::fstream::binary | std::fstream::in);
if (file.fail()) std::cout << "Couldn't open: `" << fileName << "`\n";
GLchar * data;
file.seekg(0, file.end);
int length = file.tellg();
file.seekg(0, file.beg);
data = new GLchar[length];
file.read(data, length);
if(file)
std::cout << "all characters read successfully.\n";
else
std::cout << "error: only " << file.gcount() << " could be read";
GLchar sec = data[1];
std::cout << data[0] << data[1] << "= ";
switch (sec) {
case 'M':std::cout << "Windows 3.1x"; break;
case 'A':std::cout << "OS/2 struct bitmap array"; break;
case 'I':std::cout << "OS/2 struct color icon"; break;
case 'P':std::cout << "OS/2 const color pointer"; break;
case 'C':std::cout << "OS/2 struct icon"; break;
}
int headerOffset = 50;
std::cout << "\n\n~~ "<< *(GLuint *)&data[10];
width = *(GLuint *)&data[18];
height = *(GLuint *)&data[22];
int bpp = *(int *)&data[28];
int compressionMethod = *(int *)&data[30];
std::cout << "\nDimensions: " << width << "x" << height << "\n";
std::cout << "Bits per pixel: " << bpp;
std::cout << "\nCompression Method: " << compressionMethod << "\n";
//start of pixel array - 50
unsigned char *pixels = new unsigned char[width*height * 3];
file.seekg(headerOffset + 40);
file.read((char *)pixels, width*height*3);
unsigned char tmpRGB = 0; // Swap buffer
for (unsigned long i = 0; i < width * height * 3; i += 3)
{
tmpRGB = pixels[i];
pixels[i] = pixels[i + 2];
pixels[i + 2] = tmpRGB;
}
glGenTextures(1, &texture); // Generate a texture
glBindTexture(GL_TEXTURE_2D, texture); // Bind that texture temporarily
GLint mode = GL_RGB; // Set the mode
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, mode, width, height, 0, mode, GL_UNSIGNED_BYTE, pixels);
delete[] pixels;
delete[] data;
file.close();
std::cout << "\n\n\n";
Этот код с предположением, что смещение в массиве изображения составляет 50
с этим предположением: Вот что изображение produces-
Теперь, после некоторых исследований я узнал, что The offset, i.e. starting address, of the byte where the bitmap image data (pixel array) can be found.
имеет смещение 10 в файл. Поэтому я тогда решил изменить
GLuint offset = 50;
в следующий
GLuint offset = *(GLuint *)&data[10];
Когда я делаю это, однако, цвета получают переключились на неправильный порядок. Вот изображение:
Вот объяснение проблемы: Исходное изображение идет сверху вниз, сине-зелено-красно-бело-серый. Первое изображение, которое я сделал, придерживается этого. Второй (тот, который находит смещение от кода) не делает. Может ли кто-нибудь объяснить, почему это происходит?