Algoritmus szürkeárnyalatos Delphi, blog és sharahova

Színes kép fekete-fehér (szürkeárnyalatos) lehet nagyon gyors, a kiadások 3 CPU ciklust pixelenként.

A típus TColor piros tárolja a low byte, majd zöld, kék neki. Ők lehet húzni a következő állítások:

Jól ismert képlet a szín intenzitása a kép fényerejét színes elemek:

vagy integer aritmetikai:

Az új szín pixel értékét a szürkeárnyalatos kapjuk megadásával azonos színintenzitás elemek:

Úgy tűnik, hogy minden egyszerű. De ha az algoritmus programozva a homlokán, azt találjuk, hogy a kép mérete 800x600 átalakítás 32bpp felbontás tovább tart, mint egy második:

Próbáljuk, hogy gyorsítsák fel a számítás az új pixel színét. Megjegyezzük, hogy a tényleges számítását fényerőképelemhez Grayscale1 eljárást végezzük bájtos szám 1, amely azután eltolódik az alacsony byte (bájt szám 0). Mindez megköveteli az előzetes mozgása szín komponens értékek az alacsony byte. Ha a fényerő elvégzett számítás magas byte (bájt száma 3), lehetséges, hogy nem anélkül nyírási:

Megjegyezzük továbbá, hogy a szorzás a vörös és a kék komponenseit kombinálhatjuk. Ebben az esetben a két bájt lesz további fiatalabb számított termék Blue * 77, ami nem befolyásolja az eredmény a későbbi váltás:

Továbbá, izolálás elhagyható zöldszínű komponenst, és szorozva annak megfelelő súlyozási tényezőt minden szín, és a piros és zöld komponensek majd megszorozzuk kisebb hányados:

És végül, a logikai szorzás állandó $ 00FFFFFF feleslegesen, mert megszorozva a felső bájt a Color (150 * 256) is kap nulla. Újabb egyszerűsítés kapjuk:

Ennek eredményeként az átalakítási eljárás vált másfél-két-szer gyorsabb. Ő most már teljesen az alábbiak szerint:

Ha kibontja a hurok, akkor kap gyorsulás körülbelül 1,25-szorosa:

A következő kísérleti eredményeket az alábbi táblázat foglalja össze. A használt teljesítménymérés háttérképként Bezmyatezhnost.bmp "mérete 800x600 Windows XP. Minden eljárás, kivéve az első, az úgynevezett hurok 4000 alkalommal.

A sebesség a kezdeti megvalósítása a 3000-4000 meghaladta újra. Ahol a processzor E6850 és i5-2300 vette csak 3 cikluson feldolgozására egy pixel.

Kapcsolódó cikkek