Mam problem, piszę porgram którego jednym z elementów jest operacja na bitmapie. Jestem na bank pewien że kod jest w porzędku. Pewną rzeczą którą muszę wykorzystać to szerokość i wysokość wczytanej bitmapy, i tu się zaczynają schody... Tworzę sobie bitmapkę niekompresowaną o rozmiarach 128x128 pikseli, wczytuję ją a ten wyświetla mi zamiast tego rozmiaru jakieś bzdury! pytanie co jest źle... kod zamieszczam poniżej. aha programik ma działać pod Unixem
BITMAP.H
#ifndef BITMAP_H
#define BITMAP_H
/*
Jest to biblioteka ktora obsluguje pliki bmp.
Ogranicza sie ona do zastosowan wymaghanych przez
ten program, a wiec jedynie. Opracowana zostala
na podstawie specyfikacji plikow bmp znajdujacej
sie w sieci.
*/
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
long biWidth;
long biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
typedef struct
{
int R;
int G;
int B;
} colors;
class Bitmap
{
BITMAPFILEHEADER *bitmapFileHeader;
BITMAPINFOHEADER *bitmapInfoHeader;
int ImageIdx;
private:
void BitmapInfo();
public:
int LoadBitmap(char *filename);
colors CordToRGB(int x, int y);
Bitmap();
~Bitmap();
};
#endif
BITMAP.CPP
#include <stdio.h>
#include <stdlib.h>
#include "bitmap.h"
Bitmap::Bitmap()
{
ImageIdx = 0;
bitmapInfoHeader = (BITMAPINFOHEADER *)malloc(sizeof(BITMAPINFOHEADER));
bitmapFileHeader = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
}
void Bitmap::BitmapInfo()
{
int x, y;
x = bitmapInfoHeader->biWidth;
y = bitmapInfoHeader->biHeight;
// if (bitmapInfoHeader->biWidth =! bitmapInfoHeader->biHeight)
printf(">>>>>>>>>>>>> INFO DOT. BITMAPY <<<<<<<<<<<<<\n");
printf("szerokosc: %d pikseli wysokosc: %d pikseli", x, y);
}
colors Bitmap::CordToRGB(int x, int y)
{
if ((x> bitmapInfoHeader->biWidth) || (y > bitmapInfoHeader->biHeight))
{
printf("UWAGA: Wspolzendne poza zakresem!\n");
printf("Program przyjal domyslnie (0, 0) \n");
}
}
int Bitmap::LoadBitmap(char *filename)
{
FILE *file;
unsigned char *BmpImage;
file = fopen(filename, "rb");
if (file == NULL)
{
printf("BLAD: Nie mozna otworzyc tego pliku\n");
return 1;
}
if ((bitmapFileHeader == NULL) || (bitmapInfoHeader == NULL))
{
printf("BLAD: Brak pamieci\n");
return 1;
}
fread(bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, file);
if (bitmapFileHeader->bfType != 0x4D42)
{
printf("UWAGA: To nie jest bitmapa\n");
fclose(file);
return 1;
}
fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, file);
fseek(file, bitmapFileHeader->bfOffBits, SEEK_SET);
BmpImage = (unsigned char *)malloc(sizeof(unsigned char));
if (BmpImage == NULL)
{
printf("BLAD: Brak pamieci\n");
fclose(file);
return 1;
}
BitmapInfo();
fclose(file);
}
Bitmap::~Bitmap()
{
free(bitmapInfoHeader);
free(bitmapFileHeader);
}