Toon posts:

[c/c++] GetDIBits

Pagina: 1
Acties:

Verwijderd

Topicstarter
Microsoft bedacht ooit deze mooie functie:
code:
1
2
3
4
5
6
7
8
9
int GetDIBits(
  HDC hdc,       // handle to DC
  HBITMAP hbmp, // handle to bitmap
  UINT uStartScan,   // first scan line to set
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // array for bitmap bits
  LPBITMAPINFO lpbi, // bitmap data buffer
  UINT uUsage     // RGB or palette index
);

Ik wil idd de bits uitlezen uit een HDC die ik heb verkregen met HDC screenDC = CreateCompatibleDC(GetDC(0)); Maar WAAROM wil windows, als ik dat ga doen, een HBITMAP hebben ???

Ik heb een Device Context en ik wil pixels. meer niet!

Verwijderd

Topicstarter
is er echt niemand met een idee...
(gemene manier om hem weer bovenaan te krijgen)

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat heb ik eigenlijk ook nooit helemaal begrepen, maar volgens mij werkt het prima als je gewoon even een compatible bitmap aanmaakt met hetzelfde formaat (CreateCompatibleBitmap (...))

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.


Verwijderd

Topicstarter
is op zich te proberen.. maar windows doet er vast weer een hoop mee (intern). En dan gaat het weer langzamer. Ik heb die Win32 GDI API nooit echt helemaal begrepen. Of ik denk krom of het is allemaal wat omslachtig.

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

uhm ja als je het niet probeert dan weet je het nooit :?

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.


  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
tjah, toevallig heb ik gisteren een gdi naar eigen formaat dingetje gebakken om bv tekst ed via gdi te tekenen.

hier de code...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    HDC hdc=GetDC(hwnd);
    HDC mdc = CreateCompatibleDC(hdc);
    HBITMAP bm = CreateCompatibleBitmap(hdc,w,h);
    ReleaseDC(hwnd, hdc);

    RECT r;
    r.top=0;
    r.left=0;
    r.right=w;
    r.bottom=h;
 
    HBITMAP oldBm = (HBITMAP) SelectObject(mdc, bm);
    FillRect(mdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));

    // klieder hier wat op je mdc.

    BITMAPINFO bmi;    
    bmi.bmiHeader.biSize=sizeof(bmi.bmiHeader);
    bmi.bmiHeader.biWidth=w;
    bmi.bmiHeader.biHeight=-h;
    bmi.bmiHeader.biPlanes=1;
    bmi.bmiHeader.biBitCount=32;
    bmi.bmiHeader.biCompression=BI_RGB;

    GetDIBits(mdc,bm,0,h,buffer,&bmi,DIB_RGB_COLORS);

    SelectObject(mdc, oldBm);
    DeleteObject(bm); 
    DeleteObject(mdc);

w = width, h = height
buffer is een int array met de lengte width*height. Kleuren worden gestored dmv RGBA.

en met buffer kun je dus verder gaan kloten enzo :)

<edit> ow hm, k heb je vraag n beetje verkeerd gelezen enzo :D naja, met dit stukje code moet je er wel uit kunnen komen denk ik... gewoon de mdc trashen en aanpassen zodat ie de hdc in je buffer gooit...

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


Verwijderd

Topicstarter
thanx, hier moet het mee lukken.

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

uit de GetDIBits () documentatie van de MSDN:
The bitmap identified by the hbmp parameter must not be selected into a device context when the application calls this function
maw, je hoort die SelectObject die je daarvoor doet niet uit te voeren

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.


  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
uit de msdn...
A memory device context is a device context that exists only in memory. When the memory device context is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high. Before an application can use a memory device context for drawing operations, it must select a bitmap of the correct width and height into the device context.
oftewel, de bitmap in de memory dc selecten is wel degelijk ergens goed voor :)

Maar k heb t nu aangepast, de functie SelectObject(mdc, oldBm); staat nu voor GetDIBits... k merk alleen 0,0 verschil in de werking :D Maar als t in de msdn staat, zal het wel ergens goed voor zijn ;)

mzzl, lone

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


  • The End
  • Registratie: Maart 2000
  • Laatst online: 15:46

The End

!Beginning

Als we het toch over deze functie hebben...
Ik gebruik GetDIBits in een functie om een 'Device Dependent Bitmap' (DDB) naar een 'Device Independent Bitmap' (DIB) te converteren.
Als deze functie wordt aangeroepen, blijft mijn muis heel even 'hangen'. Dit is heel irritant. Heeft een van jullie dit gemerkt en er misschien een oplossing voor gevonden?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 11 april 2002 16:36 schreef unteraarsch het volgende:
is er echt niemand met een idee...
(gemene manier om hem weer bovenaan te krijgen)
En vooral een ongewenste manier 19 minuten na de eerste post. :r

Professionele website nodig?

Pagina: 1