Newsgroup: it.comp.lang.pascal
Titolo: Aiuto Struttura file bitmap con tp6 ?

Ciao a tutti,
Chi mi saprebbe dare una dettagliata struttura del bitmap in modo da poterlo
caricare tramite una procedura in tp6 in una variabile??
Es.
bitmap
                 n byte intestaione e loro suddivisione
                 n byte palette
                 e l'immagine dove sta??
P.s sarebbe utile anche un sorgente dove poter vedere come salvare
l'immagine in una variabile
 map = array [1..64000] of byte
bitmap  = record
                                 data :   ^map
                        ....
                        ....
                  end;
Potrebbe andare bene ???
Ciao e grazie
c...@libero.it
cek

cek ha scritto:

Aiuto... il Pascal, sono quasi 5 anni che non lo uso più, ma fa lo
stesso.
BITMAPFILEHEADER bfh;
se bfh.bfType è uguale a BM è un file bitmap
a questo punto ci possono essere due diverse strutture:
BITMAPCOREHEADER bch;
BITMAPINFOHEADER bih;
che avendo differente dimensione si possono distinguere. La seconda
comunque è
quella universalmente usata.
bih.biBitCount contiente la profondità in bit, per cui nei tuoi file
dovrebbe
essere 8. Se dunque bih.biBitCount =8 subito dopo quest'ultimo header
c'è la
palette stoccata nel modo di Windows!, 256 (o meno) record di tipo
RGBQUAD.
se biHeight è positivo la bitmap è capovolta, mentre se è negativo la
bitmap è memorizzata nel modo normale alto verso basso. Non mi è mai
capitato che un programma salvi nel modo umano alto->basso, ma tutti la
capovolgono.
Dopo la palette (se c'è) ci sono i dati, sperando che tu non decida di
usare una
bitmap compressa in RLE. 
Se l'immagine non è compressa i dati sono in formato RAW e perciò
memorizzali dove ti pare. 
Type BITMAPFILEHEADER = Record
		      Mode, Driver : Integer;
		      Speed : Integer;
		      Key : array[1..MaxGiocat] of Record
						   L,R : Word;
						   end;
                      EndMode : integer;
                      Color : Array[1..MaxGiocat] of Integer;
                      MaxTurn : Array[1..3] of Integer;
                      end;
Type BITMAPFILEHEADER = Record
      	bfType : WORD;
        bfSize : DWORD;		{dimensione in byte del file};
        bfReserved1, bfReserved2 : WORD;
        bfOffBits : DWORD;
	end;
Type BITMAPFILEHEADER = Record
   	biSize : DWORD;		{dimensione in byte di questa struttura} 
	biWidth,biHeight : LongInt; {dimensioni dell'immagine in pixel} 
   	biPlanes,biBitCount : WORD;	{piani e profondità colore}
   	biCompression : DWORD;		{0 se l'immagine non è compressa}
   	biSizeImage : DWORD;		{dimensione dell'immagine (è opzionale questo
valore)}
   	biXPelsPerMeter,biYPelsPerMeter : LongInt;
   	biClrUsed : DWORD;		{colori nella tabella}
   	biClrImportant : DWORD;		{inutile per te}
	end;
Type RGBQUAD = Record
	rgbBlue, rgbGreen, rgbRed, rgbReserved : BYTE;
	end;
Ovviamente sto usando la sintassi del c, dunque per me DWORD sono
unsigned longint.
Ovviamente spero che il pascal impacchetti le strutture (record) allo
stesso modo del C (ma credo di sì).
Ovviamente non spero di avere usato la sintassi corretta per il Pascal
;-) sarebbe troppo chiederlo.

Un'ultima cosa che mi sono dimenticato.
I dati dell'immagine anche in formato RAW sono impacchettati in modo che in una riga ci
sia un multiplo di 4 pixel. Per cui se la tua immagine è di 20 pixel per riga non ti
cambia niente, ma se l'immagine è di 22 pixel per riga dovresti aspettarti righe da 24
pixel.