PDA

View Full Version : Cosa sono i piani di colore in una bitmap?


fuku san
17-05-2004, 03:25
Cosa sono i piani di colore in una bitmap?

fabio_tarantino
17-05-2004, 10:35
Boh...
forse ti riferisci alla palette (la tavola dei colori) ??

fuku san
17-05-2004, 14:09
Non credo sia quella,chi sa programmare in windows dovrebbe saperlo,io sto imparando leggendo il libro "Programmare Windows" di Charles Petzold,qualcuno lo ha letto?
Dove spiega come si creano le bitmap dice che bisogna specificare anche il numero dei piani di colore che deve avere,oltre alle dimensioni altezza x larghezza in pixel e il numero di bit per pixel...però non dice che bisogna creare delle tavolozze quindi i piani di colore non sono tavolozze...mah

fabio_tarantino
17-05-2004, 16:09
Non vorrei sbagliarmi ma forse si tratta di un errore di traduzione...
Tanto per capire meglio puoi postare un paio di righe del libro dove tratta questa cosa?

fuku san
17-05-2004, 16:48
Intanto la cosa mi sembra riguardi solo le DDB,che comunque sono importanti

-------------------------------------------------------------------------------
pag. 583
Nell'EGA la memoria è organizzata in quattro "piani del colore";ciò significa che i quattro bit che definiscono il colore di ciascun pixel non sono consecutivi nella memoria.Invece,la memoria video è organizzata in modo che tutti i bit d'Intensità siano insieme,tutti i bit di Rosso siano insieme e così via.Questo certamente suona come una peculiarità della dipendenza da dispositivo che un programmatore Windows non ha bisogno di sapere,ed è + o - così.Tuttavia questi piani del colore compaiono in alcune chiamate API,quali GetDeviceCaps e CreateBitmap.

pag. 585
Quando si chiama GetDeviceCaps si possono utilizzare le costanti BITSPIXEL e PLANES per ottenere l'organizzazione cromatica della scheda video.
...
Per esempio,una bitmap compatibile con una VGA a 16 colori aveva quattro èpiani del colore.
-------------------------------------------------------------------------------
Poi questa è una chiamata tipica a CreateBitmap

CreateBitmap(cx,cy,iPlanes,cBitsPixel,&bits);

//cx,cy larghezza e altezza in pixel,BitsPixel n.bit per pixel,bits
//array di bit organizzati come specificato dagli altri parametri,è
//la bitmap vera e propria

Questa è la struttura BITMAP

typedef struct {
LONG bmType ;// sempre a 0
LONG bmWidth;
LONG bmHeight;
LONG WidthBytes; //lo calcola Windows non serve assegnare
LONG bmPlanes; //?
LONG bmBitsPixel;
LPVOID bmBits;
}BITMAP, * PBITMAP;

e questa si usa così,si crea un handle a bitmap ed una struttura bitmap

HBITMAP hBitmap;
BITMAP bitmap;

riempio i campi della struttura e poi

hBitmap = CreateBitmapIndirect(&bitmap);

però comunque il problema è che il campo planes della struttura lo devo riempire io e cosa ci metto ??
Questa funzione sotto riempie automaticamente i campi della struttura

GetObject(hBitmap,sizeof(BITMAP),&bitmap);

però il primo argomento è un handler a bitmap,che si ottiene solo con CreateBitmap o CreateBitmapIndirect come valore di ritorno e per chiamarle è necessario dar loro in pasto il numero di piani di colore...siamo sempre lì...


Planes che valore deve avere e cosa sono i piani di colore? Questo dipende dalla scheda video evidentemente,quindi risolvo tutto usando le DIB,ma il libro dice che le DDB sono comunque importanti e bisogna saperle usare...mah non ho ancora capito perchè

cionci
17-05-2004, 17:56
Dovrebbe essere una cosa del genere: le informazioni su un pixel possono esere memorizzate tutte insieme (le componenti RGB occupano 3 byte) oppure componente per componente...il rosso di tutti i pixel insieme al rosso di tutti i pixel e così via...
Nella stragrande maggioranza dei casi dovrebbe avere valore 1 ;)

fuku san
17-05-2004, 18:16
Non ho capito bene,forse intendi dire che posso miscelare fra loro più colori invece che solo 3 come per l'rgb?

O forse che ogni piano ha una componente del colore del pixel
es. voglio determinare il colore del pixel (0,0) con 4 piani del colore in cui nei primi tre ci sono i valori rosso,verde e blu e nel quarto l'inensità.Per scrivere il colore del pixel (0,0) devo scrivere un valore all'inizio di ognuno dei quattro piani e il valore deve essere uguale a BITS PER PIXEL / NUMERO DI PIANI quindi se uso 32 bits per pixel viene 32/4 = 8 e li devo scrivere all'inizio di ogni piano quindi il primo all'inizio della bitmap,il secondo deve essere distante (BITSPERPIXEL / NUMEROPIANI)*DIMENSIONEBITMAPX*DIMENSIONEBITMAPY bits = CX*CY bytes

Boh..

cionci
17-05-2004, 20:11
Originariamente inviato da fuku san
O forse che ogni piano ha una componente del colore del pixel
es. voglio determinare il colore del pixel (0,0) con 4 piani del colore in cui nei primi tre ci sono i valori rosso,verde e blu e nel quarto l'inensità.Per scrivere il colore del pixel (0,0) devo scrivere un valore all'inizio di ognuno dei quattro piani e il valore deve essere uguale a BITS PER PIXEL / NUMERO DI PIANI quindi se uso 32 bits per pixel viene 32/4 = 8 e li devo scrivere all'inizio di ogni piano quindi il primo all'inizio della bitmap,il secondo deve essere distante (BITSPERPIXEL / NUMEROPIANI)*DIMENSIONEBITMAPX*DIMENSIONEBITMAPY bits = CX*CY bytes

Sì...qualcosa del genere, ma non l'ho mai usato (è praticamente sempre a 1)... PS: se non sbaglio i bitmap non hanno il canale alpha...

fuku san
17-05-2004, 21:11
grazie;)