2012-01-12 22 views
8

Próbuję wczytać plik bmp, aby ponownie go użyć w opengl. Znalazłem kod za pomocą google, aby załadować plik bmp. Wziąłem ten kod i umieściłem mapę bitową klasy w moim projekcie. Klasa jest daleka od ukończenia, ale już odczyt nagłówków plików jest nieprawidłowy. Po odczytaniu bajtów dla INFOHEADER i FILEHEADER nie ma właściwych wartości w moich strukturach. Kilka pomysłów?odczytywanie pliku .bmp w języku C++

// 
// Bitmap.h 
// 

#ifndef LaserMaze_Bitmap_h 
#define LaserMaze_Bitmap_h 

typedef struct      /**** BMP file header structure ****/ 
{ 
    unsigned short bfType;   /* Magic number for file */ 
    unsigned int bfSize;   /* Size of file */ 
    unsigned short bfReserved1;  /* Reserved */ 
    unsigned short bfReserved2;  /* ... */ 
    unsigned int bfOffBits;  /* Offset to bitmap data */ 
} BITMAPFILEHEADER; 

# define BF_TYPE 0x4D42    /* "MB" */ 

typedef struct      /**** BMP file info structure ****/ 
{ 
    unsigned int biSize;   /* Size of info header */ 
    int   biWidth;   /* Width of image */ 
    int   biHeight;   /* Height of image */ 
    unsigned short biPlanes;   /* Number of color planes */ 
    unsigned short biBitCount;  /* Number of bits per pixel */ 
    unsigned int biCompression; /* Type of compression to use */ 
    unsigned int biSizeImage;  /* Size of image data */ 
    int   biXPelsPerMeter; /* X pixels per meter */ 
    int   biYPelsPerMeter; /* Y pixels per meter */ 
    unsigned int biClrUsed;  /* Number of colors used */ 
    unsigned int biClrImportant; /* Number of important colors */ 
} BITMAPINFOHEADER; 

/* 
* Constants for the biCompression field... 
*/ 

# define BI_RGB  0    /* No compression - straight BGR data */ 
# define BI_RLE8  1    /* 8-bit run-length compression */ 
# define BI_RLE4  2    /* 4-bit run-length compression */ 
# define BI_BITFIELDS 3    /* RGB bitmap with RGB masks */ 

typedef struct      /**** Colormap entry structure ****/ 
{ 
    unsigned char rgbBlue;   /* Blue value */ 
    unsigned char rgbGreen;   /* Green value */ 
    unsigned char rgbRed;   /* Red value */ 
    unsigned char rgbReserved;  /* Reserved */ 
} RGBQUAD; 

class Bitmap { 
public: 
    Bitmap(const char* filename); 
    ~Bitmap(); 
    RGBQUAD* pixels; 
    BITMAPFILEHEADER fh; 
    BITMAPINFOHEADER ih; 

    private: 

}; 

#endif 

CPP

// Bitmap.cpp 
// 

#include <iostream> 
#include <stdio.h> 

#include "Bitmap.h" 

Bitmap::Bitmap(const char* filename) { 
    FILE* file; 
    file = fopen(filename, "rb"); 

    std::cout << sizeof(BITMAPFILEHEADER) << std::endl; 

    if(file != NULL) { // file opened 
     BITMAPFILEHEADER h; 
     size_t x = fread(&h, sizeof(BITMAPFILEHEADER), 1, file); //reading the FILEHEADER 

     std::cout << x; 
     fread(&this->ih, sizeof(BITMAPINFOHEADER), 1, file); 

     fclose(file); 
    } 
} 

Odpowiedz

13

nagłówka należy 2 bajty.

#pragma pack(2) // Add this 

typedef struct 
{ 
    unsigned short bfType; 
    unsigned int bfSize; 
    unsigned short bfReserved1; 
    unsigned short bfReserved2; 
    unsigned int bfOffBits; 
} BITMAPFILEHEADER; 

#pragma pack() // and this 
+0

dziękuje dobrze dzięki :) może możesz wyjaśnić, dlaczego jest to konieczne? – soupdiver

+3

Bez pragmy, krótkie pola są dopełniane do 4 bajtów. Rozmiar BITMAPFILEHEADER (bez pragmy) wynosi 20, ale w pliku jest zapisywany sekwencyjnie jako 14 bajtów. Tak więc dwie rzeczy się zdarzają: (1) struktura, którą czytasz jest pomieszana (2) czytasz za dużo, więc czytanie BITMAPINFOHEADER zaczyna się 6 bajtów za późno – Itsik

+0

bardzo dziękuję :) – soupdiver

0

BITMAPINFOHEADER :: Musisz najpierw na biSize czytać, aby wiedzieć, jak duża jest nagłówek informacji, nie można polegać na sizeof().

Sprawdź ten wiki article o formacie

4

Jak o pozwoleniem go załadować systemu operacyjnego Windows dla ciebie z LoadImage.

HBITMAP hbm = LoadImage(NULL, path, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION); 

użytkowania GetObject() można uzyskać dalsze informacje jak rozmiar, itp i GetDIBits() jeśli chcesz dostać w poszczególnych bitów.

+0

czy to nie dotyczy tego okna? – soupdiver

+0

Tak. Nie określono systemu operacyjnego, więc założyłem system Windows. Zignoruj, jeśli tak nie jest. – jschroedl