Comment lire les pixels de l'écran?
Je veux lire une zone rectangulaire, ou à l'ensemble des pixels de l'écran. Comme si la capture d'écran bouton a été pressé.
Comment je le faire?
Edit: code du Travail:
void CaptureScreen(char *filename)
{
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
HWND hDesktopWnd = GetDesktopWindow();
HDC hDesktopDC = GetDC(hDesktopWnd);
HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight);
SelectObject(hCaptureDC, hCaptureBitmap);
BitBlt(hCaptureDC, 0, 0, nScreenWidth, nScreenHeight, hDesktopDC, 0,0, SRCCOPY|CAPTUREBLT);
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = nScreenWidth;
bmi.bmiHeader.biHeight = nScreenHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
RGBQUAD *pPixels = new RGBQUAD[nScreenWidth * nScreenHeight];
GetDIBits(
hCaptureDC,
hCaptureBitmap,
0,
nScreenHeight,
pPixels,
&bmi,
DIB_RGB_COLORS
);
//write:
int p;
int x, y;
FILE *fp = fopen(filename, "wb");
for(y = 0; y < nScreenHeight; y++){
for(x = 0; x < nScreenWidth; x++){
p = (nScreenHeight-y-1)*nScreenWidth+x; //upside down
unsigned char r = pPixels[p].rgbRed;
unsigned char g = pPixels[p].rgbGreen;
unsigned char b = pPixels[p].rgbBlue;
fwrite(fp, &r, 1);
fwrite(fp, &g, 1);
fwrite(fp, &b, 1);
}
}
fclose(fp);
delete [] pPixels;
ReleaseDC(hDesktopWnd, hDesktopDC);
DeleteDC(hCaptureDC);
DeleteObject(hCaptureBitmap);
}
N'oubliez pas d'accepter les réponses, si elles vous aider.
Je sais, je n'ai pas eu ce travail encore
Vous devrez peut-être ajouter un peu plus d'informations telles que ce que vous avez essayé et ce qui est défectueux.
Ce qui inclut / compilateur, etc avez-vous utilisé?
Je sais, je n'ai pas eu ce travail encore
Vous devrez peut-être ajouter un peu plus d'informations telles que ce que vous avez essayé et ce qui est défectueux.
Ce qui inclut / compilateur, etc avez-vous utilisé?
OriginalL'auteur Newbie | 2010-04-17
Vous devez vous connecter pour publier un commentaire.
De départ avec votre code et en omettant de vérification d'erreur ...
Aussi, ce que la fenêtre HDC j'ai mis là, mon bureau ou mon programme propre fenêtre?
Regardez mes modifications, j'ai mis à jour mon code, quel est le problème avec elle?
Pourquoi avez-vous supprimer la capture de code que vous avait à l'origine? Ce que j'ai posté était censé être ajouté pour ce que vous avez eu, ce n'est pas remplacé. C'est pourquoi j'ai utilisé vos noms de variable pour
hCaptureBitmap
ethCaptureDC
.oh merde. lol. prend un certain temps à la recherche de nouveau le code >_>
OriginalL'auteur Adrian McCarthy
Commencer ici Les diverses méthodes de capture de l'écran
Utilisation
GetDIBits
pour obtenir les pixels de l'appareil-dépendant image dans une image bitmap indépendante du périphérique. Vous pouvez ensuite accéder aux pixels. Alternativement, vous pouvez créer une image de la section DIB et l'utiliser pour la capture initiale.la définition de la fonction est totale que du charabia pour moi. il ya des tonnes de mots-clés, je n'ai aucune idée de ce qu'ils veulent dire... j'aurais à google de manière récursive à partir de chaque mot clé à l'autre pour le comprendre complètement, qui va prendre des semaines. alors... je suis un peu occupé maintenant avec d'autres problèmes, je n'ai pas le temps pour ça maintenant. Si vous le souhaitez, vous pouvez répondre à cette question et d'offrir un travail de morceau de code, alors je peux juste l'accepter comme réponse correcte et être reconnaissants.
OriginalL'auteur Martin Beckett
En relisant votre question, il semble que nous peut-être obtenu sur une tangente avec la capture d'écran. Si vous voulez juste pour vérifier certains pixels sur l'écran, vous pouvez utiliser
GetPixel
.Si vous êtes en train de lire un grand nombre de pixels, alors vous êtes mieux avec une capture d'écran, puis en utilisant
GetDIBits
. L'appel deGetPixel
zillions de fois sera lente.J'ai reçu votre fonction, mais je voudrais l'utiliser de manière plus efficace pour la lecture de plus de 1 pixel. Je ne peux pas aller travailler ce GetDIBits fonction.
OriginalL'auteur Adrian McCarthy
Vous faire une capture d'écran avec BitBlt(). La taille de la prise de vue est réglé avec le nWidth et nHeight arguments. Le coin supérieur gauche est réglé avec le nXSrc et nYSrc arguments.
OriginalL'auteur Hans Passant
Vous pouvez utiliser le code ci-dessous pour lire les pixels de l'écran:
OriginalL'auteur Segy
HBITMAP n'est pas un pointeur ou un tableau, c'est une poignée qui est géré par Windows et n'a de sens que pour Windows. Vous devez demander à Windows de copier les pixels quelque part pour les utiliser.
Pour obtenir un pixel de valeur, vous pouvez utiliser GetPixel, sans même avoir besoin d'une image bitmap. Ce sera lente si vous avez besoin d'accéder à de nombreux pixels.
Pour copier une image bitmap en mémoire, vous pouvez accéder, de l'utilisation de la GetDIBits fonction.
OriginalL'auteur Mark Ransom