2017-01-14 2 views
0

Я только начал создавать загрузчик изображений растрового изображения и только из вики, я заключил смещение с начала файла, чтобы данные изображения составляли 50 байт. Для этого, я установил данные на 50. Вот оригинальное изображение:Снимки данных изображения растровых изображений, производящие различное изображение

enter image description here

Теперь, когда я загрузить изображение со следующим кодом:

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-

enter image description here

Теперь, после некоторых исследований я узнал, что 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]; 

Когда я делаю это, однако, цвета получают переключились на неправильный порядок. Вот изображение:

enter image description here

Вот объяснение проблемы: Исходное изображение идет сверху вниз, сине-зелено-красно-бело-серый. Первое изображение, которое я сделал, придерживается этого. Второй (тот, который находит смещение от кода) не делает. Может ли кто-нибудь объяснить, почему это происходит?

ответ

1

Это образец из когда я писал растровое изображение Загрузчик файла CPP

#include "BMP.h" 

void LoadBMP(const std::string fn, std::vector<Color>& image, unsigned int &width, unsigned int &height) 
{ 
    std::ifstream fin(fn.c_str(), std::ios::binary); 
     char signature[2]; 
     fin.read(signature, sizeof(signature)); 
     if (signature[0] == 'B' && signature[1] == 'M') { 
      BMPFileHeader fileheader; 
      BMPInfoHeader infoheader; 
      fin.read((char*)&fileheader, sizeof(fileheader)); 
      fin.read((char*)&infoheader, sizeof(infoheader)); 

      width = infoheader.width; 
      height = infoheader.height; 

      fin.seekg(fileheader.offset, fin.beg); 
      int PaddingBytesPerRow = (4 - ((infoheader.width * 3) % 4)) % 4; 
      Pixels pxl; 
      int cc = 0; 
      image.resize(infoheader.width*infoheader.height); 
      for (unsigned int y = 0; y < infoheader.height; y++) { 
       for (unsigned int x = 0; x < infoheader.width; x++) { 
        fin.read((char*)&pxl, sizeof(pxl)); 
        cc = x + ((infoheader.height - 1) - y) * infoheader.width; 
        image[cc].SetR(pxl.r); 
        image[cc].SetG(pxl.g); 
        image[cc].SetB(pxl.b); 
       } 
       fin.seekg(PaddingBytesPerRow, fin.cur); 
      } 
     } 
     fin.close(); 

} 

ч файл

#pragma once 
#include <string> 
#include "Graphics.h" // color array 
#include <fstream> 
#include <vector> 


struct BMPFileHeader 
{ 
    unsigned int size; 
    unsigned short reserved1, reserved2; 
    unsigned int offset; 
}; 

struct BMPInfoHeader 
{ 
    unsigned int HeaderSize; 
    unsigned int width, height; 
    unsigned short planes; 
    unsigned short bits; 
    unsigned int compression; 
    unsigned int imagesize; 
    int xResolution, yResolution; 
    unsigned int nColors; 
    unsigned int importantColors; 
}; 

struct Pixels { 
    unsigned char b, g, r; 
}; 

void LoadBMP(const std::string fn,std::vector<Color>& image, unsigned int &width,unsigned int &height); 

я использовал структуры для растрового изображения, так что будет на каких-либо магических значений и все будет загружается из файлов в структуры и затем использует эти значения, вычисляя заполнение и нажатие пикселей в вектор, я проверил этот код и его рабочий тон

Смежные вопросы