Merhaba arkadaşlar c++ ile ekran görünütüsü alıp ekrandaki nesneleri taramak istiyorum.mesela yazı rakam veya taranan görüntünün içindeki ufak bir resmi almak gibi şeyler bunu yapmak mümkün mü ? Neler yapabilirim bir yardım ?
Akın Öcal
15/11/2006, 11:36
Evet mümkün , temel olarak GDI fonksiyonlarinin kombinasyonu , asagidaki "ScreenshotAl" fonksiyon kodunu codeproject ten aldim , önce GetDesktopWindow fonksiyonu ile "desktop" penceresinin HANDLE i aliniyor , alinan HANDLE ile device context i ( yani cizimlerin tutuldugu bellek alanları) elde edildikten sonra gerisi BITMAP yapisina aktarip dosyaya kaydetmek.
Burdan yola cikip belli nesneleri , yazilari almak tabi ki mümkün , fakat o noktada image processing kod arsiviniz yoksa open source image processing kütüphanelerini kullanabilirsiniz.
////////////////////////////////////////////////////////////////////
ScreenshotAl(GetDC(GetDesktopWindow()),"screen.bmp");
//////////////////////////////////////////////////////////////////////
int Screenshotal(HDC hdc, char *pszflname)
{
HDC memdc;
HANDLE hfl;
DWORD dwBytes, dwWidth, dwHeight, dwNumColors, dwBPP, ColorSize;
void *pBits;
HBITMAP hbmp;
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
RGBQUAD colors[256];
BITMAPINFO bmpinfo;
HGDIOBJ hret;
dwWidth = GetDeviceCaps(hdc, HORZRES);
dwHeight = GetDeviceCaps(hdc, VERTRES);
dwBPP = GetDeviceCaps(hdc, BITSPIXEL);
if (dwBPP <= 8)
dwNumColors = 256;
else
dwNumColors = 0;
if (!(memdc = CreateCompatibleDC(hdc)))
return (0);
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth = dwWidth;
bmpinfo.bmiHeader.biHeight = dwHeight;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount = (WORD)dwBPP;
bmpinfo.bmiHeader.biCompression = BI_RGB;
bmpinfo.bmiHeader.biSizeImage = 0;
bmpinfo.bmiHeader.biXPelsPerMeter = 0;
bmpinfo.bmiHeader.biYPelsPerMeter = 0;
bmpinfo.bmiHeader.biClrUsed = dwNumColors;
bmpinfo.bmiHeader.biClrImportant = dwNumColors;
hbmp = CreateDIBSection(hdc, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);
if (!hbmp)
{
DeleteDC(memdc);
return (0);
}
hret = SelectObject(memdc, hbmp);
if (!hret || (hret == HGDI_ERROR))
{
DeleteDC(memdc);
return (0);
}
if (!BitBlt(memdc, 0, 0, dwWidth, dwHeight, hdc, 0, 0, SRCCOPY))
{
DeleteDC(memdc);
return (0);
}
if (dwNumColors)
dwNumColors = GetDIBColorTable(memdc, 0, dwNumColors, colors);
fileheader.bfType = 0x4D42;
ColorSize = dwNumColors * sizeof(RGBQUAD);
fileheader.bfSize = ((dwWidth*dwHeight*dwBPP) >> 3) + ColorSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
fileheader.bfReserved1 = fileheader.bfReserved2 = 0;
fileheader.bfOffBits = ColorSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
infoheader.biSize = sizeof(BITMAPINFOHEADER);
infoheader.biWidth = dwWidth;
infoheader.biHeight = dwHeight;
infoheader.biPlanes = 1;
infoheader.biBitCount = (WORD)dwBPP;
infoheader.biCompression = BI_RGB;
infoheader.biSizeImage = infoheader.biClrImportant = 0;
infoheader.biXPelsPerMeter = infoheader.biYPelsPerMeter = 0;
infoheader.biClrUsed = dwNumColors;
hfl = CreateFile(pszflname, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hfl == INVALID_HANDLE_VALUE)
{
DeleteObject(hbmp);
{
DeleteDC(memdc);
return (0);
}
}
WriteFile(hfl, &fileheader, sizeof(BITMAPFILEHEADER), &dwBytes, 0);
WriteFile(hfl, &infoheader, sizeof(BITMAPINFOHEADER), &dwBytes, 0);
if (!dwNumColors)
WriteFile(hfl, colors, ColorSize, &dwBytes, 0);
ColorSize = (dwWidth * dwHeight * dwBPP) >> 3;
WriteFile(hfl, pBits, ColorSize, &dwBytes, 0);
CloseHandle(hfl);
DeleteObject(hbmp);
DeleteDC(memdc);
return (1);
}
//////////////////////////////////////////////////////////////////////
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.