BITMAPA w C (VC++ 6.0)

0

Napisałem taki kod:

#include <stdio.h>

typedef struct {
	signed char Type1; //I litera ("B")
	signed char Type2; //II litera ("M")
	unsigned int Size; //rozmiar pliku
	short int Reserved1;
	short int Reserved2;
	unsigned int OffBits;
} BITMAPFILEHEADER2;

int main()
{
	FILE *wsk;
	BITMAPFILEHEADER2 header2;

	if (!(wsk=fopen("obrazek3.bmp","rb"))) return 1
	else printf("Otwarto pomyslnie plik BMP\n");

	fread(&header2, sizeof(BITMAPFILEHEADER2),1,wsk);

        printf("Rozmiar: %i\n",(unsigned long int)header2.Size);
	
	fclose(wsk);
	return 0;
}

Stosując w/w kod nie mogę odczytać prawidłowo rozmiaru bitmapy z jej nagłówka. Pierwsze dwa pola są rozpoznawane prawidłowo (litery B i M) natomiast wszystko co jest "później" w pliku jest źle rozpoznawane. Przykładowo dla bitmapy o rozmiarze 717 878 bajtow program podaje mi wartość 10 [???]
Czy coś jest nie tak ze struktorą? Rozmiar pola Size ma być typu DWORD - czyli 4 bajty (unsigned) - i nie działa. Wynikałoby z tego, że nie da się odczytać prawidłowo struktury pliku BMP za pomocą standardowych typów zmiennych C/C++ (32bit).
Wiem, że istnieje gotowa struktura etc. etc. ale ja chcę sam stworzyć ją od podstaw...
Pomocy...
[sciana]

info o BMP: http://myfileformats.com/search.php?name=BMP

0

No nie... tego jeszcze nie było.
Mam taką strukturę:

typedef struct {
	signed char zmienna1;
	unsigned long int zmienna2;
} Struktura;

i po wydaniu polecenia sizeof(Struktura) na ekranie uzysuję wartość... 8 [!!!]
Jak to mozliwe?! Kiedy daję osobno sizeof( signed char) i sizeof(unsigned long int) to dotaje odpowiednio 1 i 4... czyli OK. Ale od kiedy 1+4=8 [???]
Nieee... no Visual C++ rozłożył mnie w tym momencie na łopatki...
Co tu się może dziać?

0

Hmmm ja bym to tlumaczyl sobie tak ;):
32 bitowa aplikacja (4 bajty)
long nam laduje w 4 bajtach, a char w 1, tyle, ze jest uzupelniany do 4 w wyniku czego dostajesz 8 bajtów :P
Dodaj do struktury jeszcze 1-3 skladowe typu char i zobacz czy to zmieni rozmiar calej struktury... A jak po dodaniu 3 char'ow sie nie zmieni, to pewie po dodaniu czwartego wyrazenie sizeof(Struktura) bedzie mialo wartosc 12 :P

0

No właśnie jest dokładnie tak jak mówisz. Ale dlaczego jest jakieś dopełnianie do 4 bajtów?
To samo dzieje się w Dev-C++ :(
Jak mam w takim razie stworzyć strukturę nagłowka pliku BMP?

0

bo tak w ogólnym przypadku jest szybciej i łatwiej dla procesora ;P

Tu masz podobny problem i rozwiązanie:
http://4programmers.net/Forum/viewtopic.php?id=68613

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