2013-03-26 15 views
6

Sto provando a convertire hBitmap in array di byte ma non voglio utilizzare TBitmap dall'unità Graphics. La mia immagine di input è 128x64x32 bit.Conversione di HBitmap in array di byte in Delphi

var TheBits: array of array of Cardinal; 
begin 
    with info.bmiHeader do begin 
    biWidth:=131; 
    biHeight:=64; 
    biSize:=SizeOf(TBITMAPINFOHEADER); 
    biCompression:=BI_RGB; 
    biBitCount:=32; 
    biPlanes:=1; 
    biSizeImage:=0; 
    end; 

    DC := CreateCompatibleDC(0);  
    SetLength(TheBits, 128, 64);  
    GetDIBits(DC, BmpHandle, 0, 64,@TheBits[0][0],Info,DIB_RGB_COLORS); 

Questo mi dà una bella immagine (a testa in giù, naturalmente), ma ho dovuto mettere 131 in biWidth che in realtà non ha senso per me. Perché non può essere 128?

risposta

7

Sei stato estremamente fortunato. Il tuo array è in realtà 128 array completamente separati. Quando si impostano le dimensioni, Delphi è riuscito ad allocare ciascun array molto vicino al precedente, con 12 byte che li separano, tenendo conto dei vari dati di contabilità in ciascun array dinamico. Mentendo dicendo all'API che la tua bitmap era larga 131 pixel, salta quei byte quando copia i dati per una bitmap più stretta.

L'API prevede un singolo blocco contiguo di byte, che non è ciò che è una matrice dinamica multidimensionale. Un array dinamico multidimensionale è in realtà solo un ordinario array dinamico il cui tipo di elemento sembra essere un altro array dinamico.

Per correggere il codice, è necessario un array a dimensione singola; imposta la sua lunghezza al prodotto dell'altezza e della larghezza della bitmap.

+3

+1 Nizza. In realtà direi che @ Tom è stato sfortunato qui! –

+0

Assicurarsi inoltre che la larghezza della riga sia un multiplo di 4 byte. In questo caso, è già dovuto essere un'immagine a 32 bpp. Se era 24bpp, la larghezza avrebbe dovuto essere arrotondata per eccesso. – Deanna

+0

Impossibile creare in qualche modo un array 2D che occupa un singolo blocco di memoria? – Tom

Problemi correlati