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);
}
}
iyi çalıştı teşekkürler :) belki bunun neden gerekli olduğunu açıklayabilir misiniz? – soupdiver
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
çok teşekkürler :) – soupdiver