• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odczyt nagłówka bitmapy za pomocą c++

Object Storage Arubacloud
0 głosów
347 wizyt
pytanie zadane 14 grudnia 2021 w C i C++ przez Adam34334 Nowicjusz (120 p.)

Cześć, mam problem z błędnym działaniem programu. Program ma za zadanie wyświetlać dane nagłówka pliku i nagłówka obrazu bitmapy (BITMAPINFOHEADER). Nagłowek pliku odczytuje dobrze ale problem jest z odczytaniem nagłówka obrazu. 

#include <iostream>
#include <fstream>

using namespace std;

struct BITMAPFILEHEADER{
	 char bfType[3];
    unsigned int	bfSize;
	unsigned short int bfReserved1;
	unsigned short int bfReserved2;
	unsigned long	bfOffBits;
};

void odczytajBFH(ifstream & ifs, BITMAPFILEHEADER &bfh)
{
	ifs.read(reinterpret_cast<char*> (& bfh.bfType), 2);
	ifs.read(reinterpret_cast<char*> (& bfh.bfSize), 4);
	ifs.read(reinterpret_cast<char*> (& bfh.bfReserved1), 2);
	ifs.read(reinterpret_cast<char*> (& bfh.bfReserved2), 2);
	ifs.read(reinterpret_cast<char*> (& bfh.bfOffBits), 2);
	
	cout << "bfType :" << bfh.bfType << endl;
	cout << "bfSize (Dlugosc calego pliku w bajtach): " << bfh.bfSize << endl;
	cout << "bfReserved1 (Pole zarezerwowane (zwykle zero)): " << bfh.bfReserved1 << endl;
	cout << "bfReserved2 (Pole zarezerwowane (zwykle zero)): " << bfh.bfReserved2 << endl;
	cout << "bfOffBits (Pozycja danych obrazowych w pliku): " << bfh.bfOffBits << endl;
}

struct BITMAPINFOHEADER{
	unsigned int 	 biSize;
	long        	 biWidth;
	long	    	 biHeight;
	unsigned short 	 biPlanes;
	unsigned short   biBitCount;
	unsigned int   	 biCompression;
	unsigned int	 biSizeImage;
	long			 biXpelsPerMeter;
	long			 biYpelsPerMeter;
	unsigned long	 biCrlUses;
	unsigned long	 biCrlImportant;
};


void odczytajBIH(ifstream & ifs, BITMAPINFOHEADER &bih)
{
	ifs.read(reinterpret_cast<char *> (& bih.biSize), 4);
	ifs.read(reinterpret_cast<char *> (& bih.biWidth), 4);
	ifs.read(reinterpret_cast<char *> (& bih.biHeight), 4);
	ifs.read(reinterpret_cast<char *> (& bih.biPlanes), 2);
	ifs.read(reinterpret_cast<char *> (& bih.biBitCount), 2);
	ifs.read(reinterpret_cast<char *> (& bih.biCompression), 4);
	ifs.read(reinterpret_cast<char *> (& bih.biSizeImage), 4);
	ifs.read(reinterpret_cast<char *> (& bih.biXpelsPerMeter), 4);
	ifs.read(reinterpret_cast<char *> (& bih.biYpelsPerMeter), 4);
	ifs.read(reinterpret_cast<char *> (& bih.biCrlUses), 4 );
	ifs.read(reinterpret_cast<char *> (& bih.biCrlImportant), 4);
	
	cout << endl << "BITMAPINFOHEADER: " << endl << endl;
	cout << "biSize (Rozmiar naglowka informacyjnego): " << bih.biSize << endl;
	cout << "biWidth (Szerokosc obrazu w pikselach): " << bih.biWidth << endl;
	cout << "biHeight (Wysokosc obrazu w pikselach): " << bih.biHeight << endl;
	cout << "biPlanes (Liczba platow (musi byc 1)): " << bih.biPlanes << endl;
	cout << "biBitCount (Liczba bitow na piksel: 1, 4, 8, 16, 24 lub 32): " << bih.biBitCount << endl;
	cout << "biCompression (Algorytm kompresji: BI_RGB=0, BI_RLE8=1, BI_RLE4=2, BI_BITFIELDS=3): "  << bih.biCompression << endl;
	cout << "biSizeImage (Rozmiar rysunku): " << bih.biSizeImage << endl;
	cout << "biXpelsPerMeter (Rozdzielczosc pozioma): " << bih.biXpelsPerMeter << endl;
	cout << "biYpelsPerMeter (Rozdzielczosc pionowa): " << bih.biYpelsPerMeter << endl;
	cout << "biCrlUses (Liczba kolorow w palecie): " << bih.biCrlUses << endl;
	cout << "biCrlImportant (Liczba waznych kolorow w palecie): " << bih.biCrlImportant << endl;		
}

int main()
{
	BITMAPFILEHEADER bfh;
	BITMAPINFOHEADER bih;
	
	ifstream ifs("YEL.bmp", ios::binary);
		
	if(!ifs) cout << "Nie wczytano pliku!";
	if(ifs)
	{	
	odczytajBFH(ifs, bfh);
	odczytajBIH(ifs, bih);
	}
	return 0;
}

 

komentarz 14 grudnia 2021 przez Oscar Nałogowiec (29,290 p.)
edycja 14 grudnia 2021 przez Oscar

Jakiego używasz kompilatora i środowiska? Masz pola long, ale czytasz 4 bajty - jeśli to 8 bajtowe pola czytasz tylko część, reszta pozostaje śmieciami.

Pole bfOffBits w pierwszej strukturze masz long a czytasz tylko 2 bajty - coś nie tak.

Sprawdziłem w definicji formatu - ten Offset zajmuje 4 bajty, więc czytasz o 2 za mało i stąd następne części czytasz ze złych pozycji.

1 odpowiedź

0 głosów
odpowiedź 14 grudnia 2021 przez j23 Mędrzec (194,920 p.)

Jak rozumiem, problem polega na tym, że wyświetla niepoprawne info o bitmapie.

Format BMP nie jest sztywnym formatem, mogą znajdować się w nim różne nagłówki. BITMAPINFOHEADER jest nagłówkiem opcjonalnym, ergo - nie ma pewności, że bitmapa go posiada. Powinieneś to sprawdzić zaraz po wczytaniu rozmiaru nagłówka bih.biSize. Jeśli rozmiar to 40 bajtów, możesz czytać resztę danych zgodnie z układem danych nagłówka BITMAPINFOHEADER. W przeciwnym wypadku musisz czytać dane zgodnie z innymi nagłówkami opisanymi w specyfikacji formatu BMP.

Podobne pytania

0 głosów
2 odpowiedzi 190 wizyt
+2 głosów
1 odpowiedź 224 wizyt
0 głosów
1 odpowiedź 540 wizyt
pytanie zadane 11 października 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...