Zapis pliku BMP.

0

Witam.
Jestem dość początkującym programistą i chciałem zapisać dane jako bitmapę do pliku.
Do zapisu danych nagłówkowych używam fwrite, jak widać. Plik tworzy się w folderze, ma rozmiary takie same jak obrazek o identycznych parametrach, lecz w właściwościach pliku nie widnieją żadne wartości.

	FILE *w = fopen("obrazek — kopia.bmp","wb");

	if(w==NULL)
	{
	cout<<"Plik nie został otwarty"<<endl;
	exit (0);
	}
	cout<<"Plik został otwarty pomyślnie"<<endl;
////////////////////////////////////
	
fseek(w,0x0000,SEEK_SET);
	fputc(FH.bfType[0],w);	//pole identyfikacji -"BM"
	fputc(FH.bfType[1],w);
fseek(w,0x0002,SEEK_SET);
	fwrite(&FH.bfSize,1,sizeof( int),w);			//rozmiar pliku BMP
fseek(w,0x0006,SEEK_SET);
	fwrite(&FH.bfReserved1,1,sizeof(short int),w); //ponoć zawsze ma być 0
fseek(w,0x0008,SEEK_SET);
	fwrite(&FH.bfReserved2,1,sizeof(short int),w); //ponoć zawsze ma być 0
fseek(w,0x000A,SEEK_SET);
	fwrite(&PROP.BMPDataLocation,1,sizeof(unsigned int),w);//offset rozpoczęcia danych z kolorami
fseek(w,0x0012,SEEK_SET);
	fwrite(&PROP.BMPHeight,1,sizeof(unsigned int),w);//wysokosc -256
fseek(w,0x0016,SEEK_SET);
	fwrite(&PROP.BMPWidth,1,sizeof(unsigned int),w);//szerokosc -256
fseek(w,0x001A,SEEK_SET);
	fwrite(&PROP.NumColorPlanes,1,sizeof(short int),w);//ilosc planow z kolorami  -0
fseek(w,0x001C,SEEK_SET);
	fwrite(&PROP.bitsPerPixel,1,sizeof(short int),w);//rozdzielczosc kolorow pixela  - 24
fseek(w,0x001E,SEEK_SET);
	fwrite(&PROP.CompresionMode,1,sizeof(unsigned int),w);//kompresja -0
fseek(w,0x0022,SEEK_SET);
	fwrite(&PROP.BMPDataSize,1,sizeof(unsigned int),w);//rozmiar danych -196608
fseek(w,0x0026,SEEK_SET);
	fwrite(&PROP.HORIZONTAL,1,sizeof(unsigned int),w);
fseek(w,0x002A,SEEK_SET);
	fwrite(&PROP.VERTICAL,1,sizeof(unsigned int),w);
fseek(w,0x002E,SEEK_SET);
	fwrite(&PROP.NumColorPlanes,1,sizeof(unsigned int),w); //-0
fseek(w,0x0032,SEEK_SET);
	fwrite(&PROP.COLOURUSED,1,sizeof(unsigned int),w);//czy kazdy kolor jest wazny -0
fseek(w,0x0036,SEEK_SET);							 //offset na dane z miejsce danych z kolorami
	
	for(int i=0;i<PROP.BMPHeight*PROP.BMPWidth*3;i++){

	fputc(ALL.BMP_All[i],w);}
	fclose(w); 

Tutaj pytania:
Czy ta metoda(fwrite) nie jest zła i nie należy jej porzucić? Wiem, że funkcja fwrite sama ustawia offset lecz przez "niedziałanie" pomyślałem, że nie wpisuje danych tam gdzie trzeba.

Czy ktoś może mi podpowiedzieć gdzie tkwi błąd?

2

Ustaw swoją strukturę tak aby zapisać całą jednym fwrite zaś drugim - całą BMP_ALL

2

Tutaj jest opis pliku BMP z podziałem na struktury:
http://msdn.microsoft.com/en-us/library/dd183391%28v=vs.85%29.aspx

Jeśli piszesz pod Windows, to nawet nie musisz kopiować definicji tych struktur, bo masz je pod #include <windows.h>.
Wypełniasz BITMAPFILEHEADER i zapisujesz za jednym zamachem.
Wypełniasz BITMAPINFOHEADER i zapisujesz za drugim zamachem.
A potem idą dane.

0

Jak coś takiego?

 	BITMAPFILEHEADER BMPHEADER;
	BMPHEADER.bfOffBits=0x0036;
	BMPHEADER.bfReserved1=0;
	BMPHEADER.bfReserved2=0;
	BMPHEADER.bfSize=196608;
	BMPHEADER.bfType='BM';

	fwrite(&BMPHEADER,sizeof(BMPHEADER),1,w);
	BITMAPINFOHEADER BMPINFOHEADER;
	BMPINFOHEADER.biHeight=256;
	BMPINFOHEADER.biWidth=256;
////reszta informacji
	fwrite(&BMPINFOHEADER,sizeof(BMPINFOHEADER),1,w);

	for(int i=0;i<PROP.BMPHeight*PROP.BMPWidth*3;i++){
//ustawic offset?
	fputc(ALL.BMP_All[i],w);}
	fclose(w);
1

Czemu BMP_All nie zapiszesz jednym poleceniem: fwrite(ALL.BMP_All,1,PROP.BMPHeight*PROP.BMPWidth*3,w); ?

0

O rety. Myślałem, że ta funkcja zapisuje jednorazowo paczkę danych.

To nad czym się męczyłem 3/4 dnia( jakkolwiek to tragicznie nie zabrzmi) z waszymi poradami udało mi się zrobić w 1.5h i 10 linijek kodu :D.
Dziękuję.

0

Heh, trochę za dużo tych linijek.

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