manualne wczytywanie bitmapy

0

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

[Bo nie należy mieszać danych z Windowsa z Linuxem :) Albo dokładnie wiedzieć jak to zrobić...]
Jeżeli kompilujesz GCC to chyba domyślnie struktury pakowane/wyrównywane są do 4 bajtów (na 32-bitowych procesorze), dlatego struktura BITMAPFILEHEADER ma 16 bajtów, a nie 14 (2 4 2 2 4). A MUSI mieć 14, bo tak jest w formacie i w pliku, jeżeli używasz sizeof() oczywiście.
Deklaruj struktury w taki sposób:

#pragma pack(push,2) // pakowanie do 2 bajtów
// deklaracja
#pragma pack(pop)

1 użytkowników online, w tym zalogowanych: 0, gości: 1