Toon posts:

[c++] screen capture...

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik ben een proggie aan het bouwen dat (uiteindelijk) transparante (met alpha-layers) windows moet gaan tekenen.
Ik wil eerst het scherm (of een deel ervan) 'captureren' in mijn eigen bitmap_32b class. En dan wat bewerkingen uitvoeren en dat weer wegschrijven naar het scherm.

Het wegschrijven is geen probleem, dat gaat met deze regel:
SetDIBitsToDevice(appDC, r.x, r.y, r.w, r.h, 0, 0, 0, r.h, Buf, &BmpInfo, DIB_RGB_COLORS);
in deze functie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void DrawBitmap(bitmap_32b *bmp, rect r)
{
   clr_32b clr;
   LONG x, y;
   BITMAPINFO BmpInfo;

  r = bmp->geom().clip_r(r);

  BmpInfo.bmiHeader.biSize = sizeof(BITMAPINFO);
  BmpInfo.bmiHeader.biWidth = r.w;
  BmpInfo.bmiHeader.biHeight = r.h;
  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;
  SetDIBitsToDevice(appDC, r.x, r.y, r.w, r.h, 0, 0, 0, r.h, bmp->buf, &BmpInfo, DIB_RGB_COLORS);
}

Gaat allemaal perfect en vooral lekker snel!!

Maar er is niet zoiets als GetDIBitsFromDevice, die heb ik wel nodig. Ik wil namelijk de pixels van het scherm direct (of via een buffer) in mijn bitmap_32b class hebben. Zodat ik daar mee kan gaan rekenen, voor de transparantie.

voor de duidelijkheid:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef byte clr_8b;

class clr_32b
{
public:
  clr_8b blue;
  clr_8b green;
  clr_8b red;
  clr_8b alpha;
};

class bitmap_32b
{
public:
  dword type;
  clr_32b *buf;
  dword width;
  dword height;
};

iemand enig idee hoe ik al die mooie pixels van het scherm in mijn bitmap_32b class krijg :?


edit:
(ff aanpassing gedaan van 24 naar 32 bits, is minder source

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Je kunt het met DDraw doen, maar misschien is er een makkelijkere oplossing.

Verwijderd

Topicstarter
DDraw.. dat is dus echt niet de bedoeling.
Het enige wat is met Win32-API wil doen is pixels uitlezen en wegschrijven. Al het andere doe ik zelf, zodat het makkelijk naar unix te porten valt. Met DDraw word het een puinhoop.

Verwijderd

Als het goed is zijn er aanroepen om je windows doorzichtig te maken, het zou een beetje onzin zijn om zelf de alpha van iedere pixel te moeten uitrekenen.....
Waarom het wiel 2x uitvinden. Zoekt en gij zult vinden :)

Verwijderd

Topicstarter
Op donderdag 11 april 2002 14:49 schreef cynical het volgende:
Waarom het wiel 2x uitvinden. Zoekt en gij zult vinden :)
Omdat dit wiel er nog niet is, het gaat hier om een alpha layer, een 8bits bitmap die de transparantie per pixel beschrijft (0..255)!
En omdat het veel leuker is het zelf te doen. Het uitrekenen met transparantie gedeelte is er al en werkt zonder problemen. Alleen de scherm pixelz moet ik nog hebben.

Verwijderd

Als je met GetDC, de device handle van de desktop opvraagt.

HDC hDesktopDC = GetDC(0);
en dan via
GetDIBitsFromDevice(hDesktopDC, ...);

maar ik denk niet dat dit de beste methode is

ps vergeet dan geen ReleaseDC(0, hDesktopDC) te doen

Verwijderd

Topicstarter
aahhh, daar heb ik wat aan !!
maar jij wil dus zeggen dat GetDIBitsFromDevice wel bestaat ??

Ik ga het proberen :)

Verwijderd

hmm ik dacht dat jij wist dat het bestond ff zien.

neen je moet gewoon GetDIBits gebruiken
code:
1
2
3
4
5
6
7
8
9
int GetDIBits(
  HDC hdc,       // handle to device context
  HBITMAP hbmp, // handle to bitmap
  UINT uStartScan,   // first scan line to set in destination bitmap
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // address of array for bitmap bits
  LPBITMAPINFO lpbi, // address of structure with bitmap data
  UINT uUsage     // RGB or palette index
);

Verwijderd

Topicstarter
Ja ik heb 'm ook gevonden op de MS-Development site.
Alleen moet er ook een bitmap meegegeven worden???
Ik heb die niet en heb hem ook niet nodig, waarom moet windows die wel hebben. Wat doet ie ermee?? enig idee?

  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Je zal ook rekening moeten houden met het feit dat vensters onder de jouwe van uiterlijk kunnen veranderen (animated gifs in geval van een browser, of winamp bijvoorbeeld...).

Ik heb geen verstand van de Win32 API, maar ik wijs je er in iedergeval alvast op om hier wel over na te denken.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09-09 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 11 april 2002 15:31 schreef unteraarsch het volgende:
Ja ik heb 'm ook gevonden op de MS-Development site.
Alleen moet er ook een bitmap meegegeven worden???
Ik heb die niet en heb hem ook niet nodig, waarom moet windows die wel hebben. Wat doet ie ermee?? enig idee?
(zucht)
zoals ik al zei, gewoon een compatible bitmap maken met CreateCompatibleBitmap, en die als parameter meegeven

er staat overigens ook een stuk over screen capturing in de MSDN

BTW, win2k en winXP ondersteunen alpha layers in windows

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1