problem z wczytywaniem danych bitmapy (funkcja fread)

0

witam, mam taki problem przy wczytaniu danych bitmapy, naglowki czyta mi poprawnie, zas gdy probuje wczytac dane to program przestaje mi dzialac.. zaznacze linijki ktore nie dzialaja.. bardzo bym sie ucieszyl gdyby ktos wiedzial czemu program po uruchomieniu przestaje mi dzialac, bo ja juz nie mam w ogole koncepcji na to ;/ z gory dziekuje..

BMP.cpp

#include <iostream>
#include "BMP.h"
using namespace std;

CBMP::CBMP() {
}

CBMP::~CBMP() {
}

void CBMP::Open(char* NazwaPliku) {
	FILE* infile;
	if ((infile=fopen(NazwaPliku,"rb"))==NULL) {
		cout << "Nie mozna otworzyc pliku.\n" << endl;
		return;
	}
	else {
		fread(&bmpfh, sizeof(bmpfh), 1, infile);
		fread(&bmpih, sizeof(bmpih), 1, infile);

*******************************************
		m_Data=new char[bmpih.biSizeImage];
		fread(&m_Data, bmpih.biSizeImage, 1, infile);
*******************************************
	fclose(infile);
	}
}

void CBMP::Save(char *NazwaPliku) {
	FILE* infile;
	if ((infile=fopen(NazwaPliku, "wb"))==NULL) {
		cout << "Nie mozna zapisac pliku.\n" << endl;
		return;
	}
	else {
		fwrite(&bmpfh, sizeof(bmpfh), 1, infile);
		fwrite(&bmpih, sizeof(bmpih), 1, infile);
*******************************************
		fwrite(&m_Data, bmpih.biSizeImage, 1, infile);
*******************************************
	}
	fclose(infile);
}

BMP.h

struct BITMAPFILEHEADER {
	short bfType;
	int bfSize;
	short bfReserved1;
	short bfReserved2;
	int bfOffBits;
};

struct BITMAPINFOHEADER {
	int biSize;
	int biWidth;
	int biHeight;
	short biPlanes;
	short biBitCount;
	int biCompression;
	int biSizeImage;
	int biXPelsPerMeter;
	int biYPelsPerMeter;
	int biClrUsed;
	int biClrImportant;
};

class CBMP {
private:
	BITMAPFILEHEADER	bmpfh;
	BITMAPINFOHEADER	bmpih;
	char*				m_Data;
public:
	CBMP();
	~CBMP();
	void Open(char* NazwaPliku);
	void Save(char* NazwaPliku);
};

Program.cpp

#include <iostream>
#include "BMP.h"
using namespace std;

void main()
{
	CBMP b1;
	b1.Open("start.bmp");
	b1.Save("out.bmp");
}
0

Może spróbUj w owych problematycznych linijkach dać m_Data zamiast &m_Data. Coś mi się wydaje, że funkcje fread, fwrite chcą tam wskaźnika do bufora z danymi a nie adresu tego wskaźnika. Inna sprawa, że mi wczytywanie nagłówków nie działa, tzn coś tam czyta z jakiejś mojej bitmapy, ale nie są to jej poprawne dane (rozdzielczość i wielkość obrazka sie nie zgadzają, więcej nie sprawdzałem).

0

Zapewne problem leży w niewyrównanych polach struktury BITMAPFILEHEADER. Pola struktur powinny być wyrównane do jednego bajta. To, w jaki sposób możesz je wyrównać, zależy od kompilatora. Poszukaj na forum, bo było milion razy. Następna rzecz to to, że zupełnie ignorujesz możliwość wystąpienia palety. Tu masz podane jak ją czytać -> link. Nie rozumiem, dlaczego złączasz <iostream>, jeśli korzystasz z funkcji <cstdio>.

0
0x666 napisał(a)

Następna rzecz to to, że zupełnie ignorujesz możliwość wystąpienia palety.

Gdyby obsługiwać wszystkie feature'y formatów DIP (.bmp .ico .cur) to klasa miałaby kilkaset jeśli nie więcej linijek (1/4/8/24 bpp / RLE EncodedMode 8/4/1bpp / RLE AbsoluteMode 8/4/1bpp / Palety / ikony / kursory ze swoimi maskami / kilka bitmap różnych rozmiarów w pliku etc etc etc)...

Lektura (załącznik):

0

programik pisze na razie tylko na bmp 24b, wiec jest wszystko dobrze, kompilator rowniez mialem ustawiony na 1 bajt. tak jak kolega wyżej napisał że chodzi o wskaźnik na wskaźnik, czyli powinno być samo m_Data a nie &m_Data :)

Nie rozumiem, dlaczego złączasz <iostream>, jeśli korzystasz z funkcji <cstdio>.

z tego co kompilator mi pokazuje w cstdio nie ma funkcji cout, wiec pewnie dlatego :p

Bardzo dziękuje za udaną pomoc :)

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