2012-01-12 33 views
8

Opengl'de yeniden kullanmak için bir bmp dosyası yüklemeye çalışıyorum. Bir bmp dosyasının nasıl yükleneceği hakkında google üzerinden bazı kodlar buldum. Bu kodu alıp projemde bir Bitmap sınıfına girdim. Ders, bittikten çok uzakta ancak dosya başlıklarının okunması zaten yanlış. INFOHEADER ve FILEHEADER için baytları okuduktan sonra yapılarımda doğru değerler yoktur. Bazı fikirler?C++ dosyasında bir .bmp dosyası okuyor

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

cevap

13

başlık 2 bayt uyumlu hale getirilmesi gerekir.

#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

iyi çalıştı teşekkürler :) belki bunun neden gerekli olduğunu açıklayabilir misiniz? – soupdiver

+3

Pragma olmadan, kısa alanlar 4 bayta kadar doldurulur. BITMAPFILEHEADER (w/o pragma) boyutu 20'dir, ancak dosyada sırayla 14 bayt olarak yazılmıştır. Yani iki şey olur: (1) okuduğunuz yapı berbat (2) çok fazla okursunuz, bu yüzden BITMAPINFOHEADER okuma 6 bayta çok geç – Itsik

+0

çok teşekkürler :) – soupdiver

0

BITMAPINFOHEADER :: Sen bilgileri başlığı ne kadar büyük, sen sizeof() güvenemez bilmek için ilk biSize okumak gerekir.

Kontrol dışarı dosya biçimi

4

hakkında bu wiki article nasıl LoadImage ile sizin için Windows işletim sistemi yükü o icar hakkında. Tek tek bit almak istiyorsanız

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

Kullanım GetObject()

vb boyutu ve GetDIBits() gibi ayrıntıyı daha bulmak için.

+0

ile uyumlu mu? – soupdiver

+0

Yep. İşletim sistemini belirtmediniz, böylece Windows varsaydım. Durum böyle değilse göz ardı edin. – jschroedl

İlgili konular