2010-11-21 19 views
7

J'utilise GetPixel() de gdi32.dll dans une application .NET pour échantillonner la couleur d'un pixel n'importe où sur l'écran. Cela fonctionne bien mais c'est un goulot d'étranglement majeur pour moi.Existe-t-il une alternative plus rapide à GDI GetPixel()?

Existe-t-il un moyen plus rapide de le faire?

+2

De quel type d'usage avez-vous besoin? Cela peut valoir la peine de saisir une région à l'écran et d'en échantillonner des pixels. – hometoast

+0

Mon application permet à l'utilisateur d'échantillonner la couleur de n'importe où sur l'écran (en dehors de mon application) en temps réel. +1 Bonne idée de la restriction à une région: je verrai si je peux le faire. – stucampbell

Répondre

8

L'accès rapide aux pixels est possible en utilisant la méthode LockBits() du Bitmap. Cela vous retournera un objet contenant un pointeur au début des données de pixel et vous pouvez utiliser un code non sécurisé pour accéder à la mémoire.

http://www.bobpowell.net/lockingbits.htm

+0

Merci. J'ai upvoted parce que c'est un article utile pour une autre manipulation d'image que je fais. Mais cela ne m'aide pas à obtenir la couleur d'un pixel n'importe où sur l'écran (sauf si je prends d'abord une capture d'écran, ce qui n'est pas ce que je veux). – stucampbell

5

GetPixel est lent pour deux raisons:

  1. Puisque vous êtes polling l'écran - chaque appel à GetPixel conduit à une transaction au pilote vidéo, qui à son tour prend le pixel les données de la mémoire vidéo.

    En revanche en utilisant GetPixel sur DIB est beaucoup plus rapide.

  2. Quoi qu'il en soit GetPixel fait plusieurs choses, y compris les coordonnées clipping/transformations et etc.

Alors que si vous utilisez pour interroger de nombreuses valeurs de pixels à la fois - vous devriez essayer d'arranger cela en une seule transaction vers GDI/pilote vidéo. En utilisant GDI, vous devez créer une taille DIB de taille adéquate (voir CreateDIBSection). Après la création, vous recevrez un pointeur direct sur les données des bits d'image. Copiez ensuite la partie de l'image sur votre DIB (voir BitBlt). N'oubliez pas d'appeler le GdiFlush avant de vérifier le contenu de la DIB (car les pilotes vidéo peuvent effectuer un dessin asynchrone). En utilisant GD +, vous pouvez faire la même chose avec une syntaxe un peu plus simple.

+0

Merci. Je vais l'essayer. – stucampbell