Jaki jest najszybszy sposób na porównanie dwóch bitmap o równych rozmiarach, aby określić, czy są one identyczne?
Próbuję napisać funkcję określającą, czy dwie bitmapy o równych rozmiarach są identyczne czy nie. Funkcja, którą mam teraz, po prostu porównuje piksel na raz w każdej bitmapie, zwracając wartość false na pierwszym nierównomiernym pikselu.
Chociaż to działa i działa dobrze w przypadku małych map bitowych, w produkcji będę używał tego w wąskiej pętli i na większych obrazach, więc potrzebuję lepszego sposobu. Czy ktoś ma jakieś zalecenia?
Językiem, którego używam, jest przy okazji C # - i tak, już używam metody .LockBits. =)
Edytować: Zakodowałem implementacje niektórych podanych sugestii i oto testy. Konfiguracja: dwie identyczne bitmapy (najgorszy przypadek), rozmiar 100x100, po 10 000 powtórzeń każdy. Oto wyniki:
CompareByInts (Marc Gravell) : 1107ms
CompareByMD5 (Skilldrick) : 4222ms
CompareByMask (GrayWizardX) : 949ms
W CompareByInts i CompareByMask używam wskaźników do bezpośredniego dostępu do pamięci; w metodzie MD5 używam Marshal.Copy do pobrania tablicy bajtów i przekazania jej jako argumentu MD5.ComputeHash. CompareByMask jest tylko nieznacznie szybsza, ale biorąc pod uwagę kontekst, myślę, że każde ulepszenie jest przydatne.
Dziękuję wszystkim. =)
Edytuj 2: Zapomniałem włączyć optymalizacje - dzięki temu odpowiedź GrayWizardX może być jeszcze większa:
CompareByInts (Marc Gravell) : 944ms
CompareByMD5 (Skilldrick) : 4275ms
CompareByMask (GrayWizardX) : 630ms
CompareByMemCmp (Erik) : 105ms
Ciekawe, że metoda MD5 w ogóle się nie poprawiła.
Edytuj 3: Wysłałem moją odpowiedź (MemCmp), która wyrzuciła inne metody z wody. o.O