.net - Er der et hurtigere alternativ til GDI GetPixel ()?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger GetPixel() fra gdi32.dll i en .NET app til at prøve farve på en pixel hvor som helst på skærmen. Det virker ok, men det er en stor ydeevne flaskehals for mig.


Er der en hurtigere måde at gøre det på?

Bedste reference


Hurtig adgang til pixels er mulig ved hjælp af LockBits() metode til Bitmap. Dette vil vende tilbage til dig et objekt, der indeholder en peger til starten af ​​pixeldataene, og du kan bruge usikker kode til at få adgang til hukommelsen.


http://www.bobpowell.net/lockingbits.htm[11]

Andre referencer 1


GetPixel er langsomt af to grunde:



  1. Da du 'poller' skærmen, fører hvert opkald til GetPixel til en transaktion til videodriveren, som igen tager pixeldataene fra videominnet.


    I strid med GetPixel på DIB'er er meget hurtigere.

  2. Anyway GetPixel gør flere ting, herunder koordinater, klipning/transformationer og osv.



Så hvis du bruger for at søge mange pixelværdier på én gang - bør du prøve at arrangere dette i en enkelt transaktion til GDI/video driver.


Ved hjælp af GDI skal du oprette en DIB af tilstrækkelig størrelse (se CreateDIBSection). Efter oprettelsen får du en direkte peger til billedbitdataene, og kopier derefter billeddelen til din DIB (se BitBlt). Husk også at ringe GdiFlush, før du rent faktisk kontrollerer indhold af DIB (da video drivere kan gøre asynkron tegning).


Ved hjælp af GD + kan du faktisk gøre det samme, med en lidt enklere syntaks.