Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » DDB, DIB Probleme mit Bitmap

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.07.2007, 15:06 Uhr
muck2000



Hallo,

mit folgendem Code generiere ich einen Screenshot und speichere diesen ab:


C++:
bool CPSDlg::Screenshot(CWnd* pWnd)
{
    CWindowDC CWndDC(pWnd);
    CDC CMemDC;
    CMemDC.CreateCompatibleDC(&CWndDC);
    
        CRect CClientRect;
        CClientRect.left = CClientRect.top = 0;
        CClientRect.right = ::GetSystemMetrics(SM_CXSCREEN);
        CClientRect.bottom = ::GetSystemMetrics(SM_CYSCREEN);
    
    CBitmap CShotBmp;
    CShotBmp.CreateCompatibleBitmap(&CWndDC, CClientRect.Width(),CClientRect.Height());

    CMemDC.SelectObject(&CShotBmp);
    
    CMemDC.BitBlt(0,0,CClientRect.Width(),CClientRect.Height(),&CWndDC,0,0,SRCCOPY);

    BITMAP bitmap;
    CShotBmp.GetBitmap(&bitmap);
    
    int size = bitmap.bmWidth*bitmap.bmHeight*bitmap.bmBitsPixel/8;
    BYTE *lpBits = new BYTE[size];
    
    GetBitmapBits((HBITMAP)CShotBmp,size,lpBits);
    WriteBmp(&bitmap,(int*)lpBits);

    return true;
}

void CPSDlg::WriteBmp(BITMAP *bmp, int* data)
{
    BITMAPINFO Bmi;
    memset(&Bmi,0,sizeof(BITMAPINFO));
    Bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    Bmi.bmiHeader.biWidth = bmp->bmWidth;
    Bmi.bmiHeader.biHeight = bmp->bmHeight;
    Bmi.bmiHeader.biPlanes = 1;
    Bmi.bmiHeader.biBitCount =bmp->bmBitsPixel;
    Bmi.bmiHeader.biCompression = BI_RGB;
    Bmi.bmiHeader.biSizeImage = bmp->bmHeight*bmp->bmWidth*bmp->bmBitsPixel/8;

    FILE* image = fopen ("C:\\Test.bmp","wb");
    if(image==0)
    return;
    int h = abs(Bmi.bmiHeader.biHeight);
    int w = abs(Bmi.bmiHeader.biWidth);
    Bmi.bmiHeader.biHeight=-h;
    Bmi.bmiHeader.biWidth=w;
    int sz = Bmi.bmiHeader.biSizeImage;

    BITMAPFILEHEADER bfh;
    bfh.bfType=('M'<<8)+'B';
    bfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    bfh.bfSize=sz+bfh.bfOffBits;
    bfh.bfReserved1=0;
    bfh.bfReserved2=0;
    fwrite(&bfh,sizeof(bfh),1,image);
    fwrite(&Bmi.bmiHeader,sizeof(BITMAPINFOHEADER),1,image);
    fwrite(data,sz,1,image);
    fclose(image);
}



Funktioniert "fast" wunderbar.
Bei 32bit Auflösung ist alles OK, bei 16bit hat das ganze einen Blaustich, und bei 8bit ist es nur noch weiß.

Wie bekomme ich das bei 16bit bzw. 8bit ordenlich gelöst?

Im Voraus vielen Dank.
Gruss Sven
--
Nimm das Leben nicht so ernst, da es eine Sache ist aus der Du eh nicht lebend raus kommst!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: