copier ecran et obtenir les couleurs rapidement.
Voila je cherche à faire une copie d'ecran, puis de pouvoir chercher des couleurs dans cette copie. Le plus rapidement possible.
j'ai essayé :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| void PhotoHdcEcran(HDC hdc)
{
hdc = CreateDC("DISPLAY", 0, 0, 0);
}
void HdcCouleur(HDC hdc, int x, int y, unsigned char *r, unsigned char *g, unsigned char *b)
{
COLORREF Pix;
Pix = GetPixel(hdc, x, y);
*r = GetRValue(Pix);
*g = GetGValue(Pix);
*b = GetBValue(Pix);
} |
ca marche, c'est rapide mais le résultat des couleurs est sur l'écran en temps réel alors que je voudrai une image fixe.
On dirait que mon hdc est un acces à l'écran et non une copie image de ce dernier... comment faire pour faire aussi court et le faire sur un acces fixe?
Merci à vous tous.
HDC ScreenSrc = GetWindowDC(0);
Même problème...
En fait je comprends que la fonction GetWindowDC et CreateDC ("display",0,0,0) donne des handles sur l'affichage de l'ecran.
J'en déduis qu'un handle et un accès temps réel car dès que l'on demande les couleurs en x,y du hdc on obtient les couleurs au moment ou on les demande et non celle du moment ou l'on a crée le handle.
Suis je dans le vrai jusque là???
Donc sur le lien que tu m'as envoyé 3DArchi je vois qu'il poursuit avec BiltBlt. Je dois avouer que je ne sais pas encore comment je vais récupéré mes couleurs... lol. Mais je vais creuser. Donc je laisse encore la question le temps de trouver ou si d'autre idée me sont données.
Merci 3DArchi.
apres un peu de temps sur msdn
il y a encore une ou deux chose qui me semblent obscure. Déjà je dis ce que j'ai compris :
HDC hdcMemory = CreateCompatibleDC(hdcEcran)
// on crée un emplacement mémoire identique pour recevoir la copie
HBITMAP hBitmap = CreateCompatibleBitmap(hdcEcran, LARGEUR_ECRAN, HAUTEUR_ECRAN); /* On va utiliser ce bitmap sur notre Memory DC ... */
// ici on crée un hbitmap vide??? de la taille de l'ecran.
SelectObject(hdcMemory, hBitmap); /* ... Voilà c'est fait */
// "Selects an object into the device context." heuu oui... pourquoi pas... donc on sélectionne dans le hdcMemory un hbitmap qui doit ressembler à celui que l'on vient de crée.
/* On copie tous les bits du DC de l'écran vers notre Memory DC */
BitBlt(hdcMemory, 0, 0, LARGEUR_ECRAN, HAUTEUR_ECRAN, hdcEcran, 0, 0, SRCCOPY);
Bien.. bien...
pourquoi apres le CreateCompatible on ne passe pas directement au BitBlt(vu qu'ils sont compatible)?
Pourquoi crétons ce Hbitmap (je n'ai pas compris ce que représente ce Hbitmap)
Et la fonction SelectObject je ne la comprends pas bien non plus. On sectionne un objet dans le contexte. Pourquoi ne pas donné simplement la class de l'objet à sélectionner dans ce cas?
Et pourquoi faire cette sélection vu qu'il y a tellement peu d'argument que je ne voit pas a quoi cela abouti.