Une sorte de capture d'image...

Résolu
cs_tsc Messages postés 8 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 2 mai 2006 - 29 sept. 2004 à 11:05
cs_bilal Messages postés 87 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 4 mars 2010 - 8 nov. 2004 à 12:15
Bonjour,
Voilà j'ai un petit problème avec une source qui permet de capturer l'image de sa
webcam. source = http://www.cppfrance.com/code.aspx?ID=24541

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;
}

// Colle l'image
if(!BitBlt(memdc, 0, 0, 320, 240, hdc, 0, 0, SRCCOPY))
{
// Fait le ménage
DeleteObject(hbmp);
DeleteDC(memdc);
free(pBits);
return;
}

// Récupère le DC
hDC_tmp=GetDC(NULL);

// Récupère les pixels
GetDIBits(hDC_tmp, hbmp, 0, 240, lpBits, &bmpinfo, DIB_RGB_COLORS);

// Fait le ménage
ReleaseDC(NULL, hDC_tmp);

// 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);
}

3 réponses

cs_tsc Messages postés 8 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 2 mai 2006
6 oct. 2004 à 09:52
Merci de ton aide mais il me semble à première vue que l'image soit obligé d'être affichée pour être capturée

Tsc
3
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
1 oct. 2004 à 13:12
salut, regarde la source que j'ai fait:
http://www.cppfrance.com/code.aspx?ID=25831

elle permet de voir l'image vu par la webcam, de prendre des captures et de l'envoyer sur un serveur ftp
Bob...

"La chance accorde ses faveur aux esprits avertis..."
0
cs_bilal Messages postés 87 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 4 mars 2010
8 nov. 2004 à 12:15
en c++ builder

AnsiString FichierHTML;
FichierHTML = "c:\\test.bmp";
WideString Url = FichierHTML;
VideoCapX->SaveFrame(Url);
Image1->Picture->LoadFromFile(Url);

si tu ne veut pas qu'on voit la web came alors met son etat

visible = false;

@+
VGTA
0
Rejoignez-nous