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
Répondre
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.
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
@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). –
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.
Je parlais du HDC physique. – user963241