Mon problème est que ce code à l'aire de faire une sorte de print screen, au lieu de
lire directement dans le HDC. Par exemple quand je passe une fenêtre par dessus l'image
source ou tous simplement si je ne fait pas afficher l'image source.
Quelqu'un a une idée pour pouvoir capturer les pixel d'un HDC sans que ce HDC soit afficher?
En sachant que le je connais le HDC(hDC_WC) et le HWND (hWnd_WC) de mon image source ??
Merci d'avance
Tsc
void CWebCam::ChargeCapture(int ID_Bmp)
{
int i, j; // Bcl
int R, G, B; // Recupère des infos
HDC hDC_tmp; // Pour récupérer les pixels
LPBYTE lpBits = new BYTE[4*320*240]; // Idem
HWND hwnd=hWnd_WC; // Fenetre de la capture
HDC memdc, hdc; // DC
void *pBits; // Tbl de pixel
HBITMAP hbmp; // Image
BITMAPINFO bmpinfo; // info sur l'image
HGDIOBJ hret; // Pour récupérer l'image
hdc = hDC_WC; // Va avec le hWnd
// C'est marqué
if(!(memdc = CreateCompatibleDC(hdc)))
return;
// Donne les infos sur le bitmap
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth = 320;
bmpinfo.bmiHeader.biHeight = 240;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount = 32;
bmpinfo.bmiHeader.biCompression = BI_RGB;
bmpinfo.bmiHeader.biSizeImage = 0;
bmpinfo.bmiHeader.biXPelsPerMeter = 0;
bmpinfo.bmiHeader.biYPelsPerMeter = 0;
bmpinfo.bmiHeader.biClrUsed = 0;
bmpinfo.bmiHeader.biClrImportant = 0;
// Création du bitmap
hbmp = CreateDIBSection(hdc, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);
// En cas d'erreur
if(!hbmp)
{
// Fait le ménage
DeleteObject(hbmp);
DeleteDC(memdc);
free(pBits);
return;
}
// Sélectionne le mendc avec l'image
hret = SelectObject(memdc, hbmp);
if(!hret || (hret == HGDI_ERROR))
{
// Fait le ménage
DeleteObject(hbmp);
DeleteDC(memdc);
free(pBits);
return;
}
// Parcoure les pixels et les stocke dans un tbl
for(i=0; i<240; i++)
for(j=0; j<320; j++)
{
// Récupère chaque coef du RGB
TblImage[ID_Bmp].points[i][j].R = R = lpBits[4*320*(239-i)+4*j+2];
TblImage[ID_Bmp].points[i][j].G = G = lpBits[4*320*(239-i)+4*j+1];
TblImage[ID_Bmp].points[i][j].B = B = lpBits[4*320*(239-i)+4*j];
// Calcul la couleur
TblImage[ID_Bmp].points[i][j].Couleur = R + 256*G + 256*256*B;
}
// Fait le ménage
free(lpBits);
DeleteObject(hbmp);
DeleteDC(memdc);
}