2010-10-07 14 views
1

En utilisant GetPixel, Est-ce exact que vous récupérez les informations de pixel que HDC stocke temporairement après avoir dessiné sur chaque appel WM_PAINT?GetPixel dans GDI

+0

Je parlais du HDC physique. – user963241

Répondre

0

Il obtiendra la valeur de pixel x, y de n'importe quel bitmap est sélectionné dans le HDC.

http://msdn.microsoft.com/en-us/library/dd144909%28VS.85%29.aspx

GetPixel est assez lent, si je me souviens bien. Selon ce que vous voulez faire, il sera probablement beaucoup plus rapide d'accéder directement aux données bitmap brutes.

+0

Mais quand vous faites cela, je ne suis pas certain que GDI videra toutes les opérations directement à votre bitmap brut (ie _durant_ le WM_PAINT, entre 'BeginPaint()' et 'EndPaint()' votre bitmap peut être désynchronisé. Raymond Chen a récemment écrit sur ce sujet: http://blogs.msdn.com/b/oldnewthing/archive/2010/09/23/10066473.aspx. Vous pouvez bien sûr "réparer" cela en appelant 'GdiFlush', comme le fait' GetPixel'. Mais cela rend probablement tout aussi lent l'accès direct que d'appeler GetPixel en premier lieu. – MSalters

+1

@MSalters: Je ne suis pas certain mais je pense que c'est plus que GdiFlush qui rend GetPixel/SetPixel lent. (Sauf si GdiFlush est très mal implémenté :)). S'il n'y a rien à tirer, GdiFlush devrait être instantané. En appelant GetPixel dans une boucle, seul le premier flush (au maximum) devrait ralentir les choses. Je pense qu'il y a plus de frais généraux pour GetPixel que juste le flush. par exemple. Potentiellement avoir à parler au GPU (si le bitmap est dans la mémoire GPU), travailler sur quel type de bitmap et pixel/couleur mise en page/format de traiter à chaque appel, etc IMO, obtenir les données brutes une fois et en boucle devrait être plus rapide (dans la plupart des cas). –

0

Cela dépend, tous les périphériques ne prennent pas en charge GetPixel. Une application doit appeler GetDeviceCaps pour déterminer si un périphérique spécifié prend en charge cette fonction.