Windows ha una struttura dati RTL_BITMAP
che è possibile utilizzare insieme alle relative API.
Ma avevo bisogno il codice per questo qualche tempo fa, e così l'ho scritto qui (attenzione, è un po 'brutto):
https://gist.github.com/3206128
ho solo parzialmente provato, quindi potrebbe ancora avere bug (specialmente su reverse
). Ma una versione recente (solo leggermente diversa da questa) sembrava essere utilizzabile per me, quindi vale la pena provare.
L'operazione fondamentale per l'intera cosa è essere in grado di - rapidamente - trovare la lunghezza di una corsa di bit:
long long GetRunLength(
const void *const pBitmap, unsigned long long nBitmapBits,
long long startInclusive, long long endExclusive,
const bool reverse, /*out*/ bool *pBit);
Tutto il resto dovrebbe essere facile da costruire su questo, data la sua versatilità.
Ho cercato di includere del codice SSE, ma non ha migliorato sensibilmente le prestazioni. Tuttavia, in generale, il codice è molte volte più veloce dell'analisi bit-by-bit, quindi penso che potrebbe essere utile.
Dovrebbe essere facile verificare se è possibile ottenere il buffer vector<bool>
in qualche modo - e se si è su Visual C++, quindi c'è una funzione che ho incluso che fa questo per voi. Se trovi bug, sentiti libero di farmelo sapere.
non si può trattare il vostro array come array di interi e confrontare intero a zero? – Andrew
@Andrew: Dipende da cosa stai cercando di ottenere ... i bit potrebbero non essere allineati 8 bit alla volta. – Mehrdad
è possibile confrontare 6 byte (se il bmp è un file immagine a colori: 6 byte è due pixel contigui) con una matrice di 6 zeri. –