Conversia unei imagini color în alb-negru (în nuanțe de gri) poate fi foarte rapidă, petrecând 3 cicluri de procesor pe pixel.
În tipul TColor, culoarea roșie este stocată în octetul de joasă ordine, apoi în cel verde, urmat de cel albastru. Acestea pot fi extrase utilizând următorii operatori:
O formulă bine cunoscută pentru calcularea luminozității imaginii color prin intensitatea componentelor de culoare:
sau în aritmetica întregului:
Noua valoare a culorii pixelilor în tonuri de gri se obține prin stabilirea aceleiași intensități a tuturor componentelor de culoare:
Se pare că totul este simplu. Dar dacă programați algoritmul pe frunte, veți constata că conversia unei imagini de 800x600 cu o rezoluție de 32bpp durează mai mult de o secundă:
Să încercăm să accelerăm calculul culorii noului pixel. Rețineți că, de fapt, calculul luminozității pixelilor în procedura Grayscale1 se face în octetul cu numărul 1, care este apoi mutat la octetul scăzut (octetul numărul 0). Toate acestea necesită deplasarea preliminară a valorilor componentelor de culoare către octetul inferior. Dacă calculul luminozității este efectuat în octetul mare (octetul numărul 3), atunci puteți face acest lucru fără o schimbare preliminară:
Rețineți, de asemenea, că multiplicarea componentelor albastre și roșii poate fi combinată. În acest caz, în cele două octeți inferiori, produsul Blue * 77 va fi calculat suplimentar, ceea ce nu va afecta rezultatul datorat schimbării ulterioare:
În plus, puteți face fără alocarea componentei verde și înmulțiți toate culorile cu coeficientul de greutate corespunzător și apoi multiplicați componentele roșii și verzi cu coeficientul mai mic:
În cele din urmă, multiplicarea logică prin constanta $ 00FFFFFF este inutilă, deoarece Atunci când se înmulțește octetul de înaltă ordine a culorii cu (150 * 256), zero va fi încă recepționat. După o altă simplificare, obținem:
Ca rezultat, procedura de conversie a devenit una și jumătate până la de două ori mai rapidă. Totul arată acum:
Dacă extindeți ciclul, puteți obține o accelerare de aproximativ 1,25 ori:
Sub tabelul de mai jos sunt rezumate rezultatele experimentelor. Pentru a măsura performanța, am folosit imaginea de fundal "Serenity.bmp", 800x600 în mărime din Windows XP. Toate procedurile, cu excepția primului, au fost chemați în ciclu de 4000 de ori.
Viteza implementării inițiale este depășită de 3000-4000 de ori. În același timp, procesoarele E6850 și i5-2300 au necesitat doar 3 măsuri pe procesare pixeli.