2012-01-12 2 views
8

Я пытаюсь загрузить файл BMP для повторного использования его в opengl. Я нашел код через google о том, как загрузить файл BMP. Я взял этот код и поместил в класс Bitmap в свой проект. Класс находится далеко от завершения, но уже чтение заголовков файлов идет не так. После чтения байтов для INFOHEADER и FILEHEADER в моих структурах нет правильных значений. Некоторые идеи?чтение файла .bmp в 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 

СРР

// 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); 
    } 
} 

ответ

13

Заголовок должен быть 2 байта выровнены.

#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

хорошо работал благодаря :) Возможно, вы можете объяснить, почему это необходимо? – soupdiver

+3

Без прагмы короткие поля заполняются до 4 байтов. Размер BITMAPFILEHEADER (без прагмы) равен 20, но в файле он записывается последовательно в 14 байтов. Итак, происходят две вещи: (1) прочитанная структура перепутана (2) вы слишком много читаете, поэтому чтение BITMAPINFOHEADER начинается с 6 байт слишком поздно – Itsik

+0

спасибо большое :) – soupdiver

0

BITMAPINFOHEADER :: Вы должны прочитать первый в biSize, чтобы знать, насколько велика информация заголовка, вы не можете полагаться на sizeof().

Проверить это wiki article о формате файла

4

Как насчет позволяя вашей загрузки ОС Windows, это для вас с LoadImage.

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

Использование GetObject() найти дополнительную информацию, например, размер и т.д., и GetDIBits(), если вы хотите получить на отдельные биты.

+0

не связаны ли эти окна? – soupdiver

+0

Да. Вы не указали ОС, поэтому я предположил Windows. Игнорируйте, если это не так. – jschroedl

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