System Windows ma strukturę danych RTL_BITMAP
, której można używać wraz z jej interfejsami API.
Ale potrzebny kod do tego jakiś czas temu, a więc napisałem go tutaj (uwaga, to trochę brzydki):
https://gist.github.com/3206128
mam tylko częściowo go testowane, więc może jeszcze błędy (zwłaszcza na reverse
). Ale ostatnia wersja (tylko trochę inna od tej) wydawała mi się użyteczna, więc warto spróbować.
Fundamentalna praca na cały rzeczą jest możliwość - szybko - znajdź długość przebiegu bitów:
long long GetRunLength(
const void *const pBitmap, unsigned long long nBitmapBits,
long long startInclusive, long long endExclusive,
const bool reverse, /*out*/ bool *pBit);
Wszystko inne powinno być łatwe do zbudowania na tym, ze względu na jego uniwersalność.
Próbowałem dołączyć kod SSE, ale nie poprawił on znacząco wydajności. Jednak generalnie kod jest wielokrotnie szybszy niż analiza bit-by-bit, więc myślę, że może się przydać.
Powinno być łatwo przetestować, czy można jakoś uchwycić bufor vector<bool>
- a jeśli korzystasz z Visual C++, to jest funkcja, którą zawarłem, która robi to za ciebie. Jeśli znajdziesz błędy, daj mi znać.
Nie możesz traktować swojej tablicy jako tablicy liczb całkowitych i porównać liczbę całkowitą do zera? – Andrew
@Andrew: To zależy od tego, co próbujesz osiągnąć ... bity mogą nie być wyrównane do 8 bitów na raz. – Mehrdad
można porównać 6 bajtów (jeśli bmp jest obrazem koloru: 6 bajtów to dwa contigouous piksele) z tablicą 6 zer. –