Kompatibles Bitmap



  • Hallo,

    irgendwie krieg ich es nicht hin, ein (kompatibles) Bitmap in meine Anwendung zu zeichnen. Ich versuche, einen Byte-Buffer (8-Bit Graustufen-Daten) in einen DC zu StretchBlt'en. Aber die einzige Methode, die bisher funktioniert, geht über einen eher unkonventionellen und leider inakzeptablen Umweg. So geh ich bisher vor:

    HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, "bitmap.bmp", IMAGE_BITMAP,
                0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    
            CBitmap cBmp;
            cBmp.Attach(hBmp);
            cBmp.SetBitmapBits(m_width*m_height, datap);
    
            CDC dcMem;
            dcMem.CreateCompatibleDC(dc);
            HBITMAP BitmapOld = (HBITMAP)SelectObject(dcMem, cBmp);
            dc->StretchBlt(xOffset, yOffset, m_width*rectSizeX, m_height*rectSizeY, &dcMem, 0, 0, m_width, m_height, SRCCOPY);
            dcMem.SelectObject(BitmapOld);
            dcMem.DeleteDC();
    

    Die Datei bitmap.bmp enthält ein unkomprimiertes 8-Bit Graustufen-Bild mit den Ausmaßen m_width*m_height (siehe Code). Bisher kann ich nur über das Laden dieser Datei, Attach'en an CBitmap cBmp und Aufrufen von SetBitmapBits mit einem Pointer zu meinem Byte-Buffer (datap), damit einem Überschreiben der Bitmap-Daten aus der Datei, ein kompatibles Bitmap erzeugen, das ich dann auch in meine Anwendung bzw. deren DC malen kann. Gehe ich so hier vor

    BITMAPINFO *lpInfo = new BITMAPINFO;
        lpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        lpInfo->bmiHeader.biWidth = m_width;
        lpInfo->bmiHeader.biHeight = m_height;
        lpInfo->bmiHeader.biPlanes = 1;
        lpInfo->bmiHeader.biBitCount = 8;
        lpInfo->bmiHeader.biCompression = BI_RGB;
        lpInfo->bmiHeader.biSizeImage = m_width*m_height;
        lpInfo->bmiHeader.biClrUsed = 0;
    
        HBITMAP hBmp = (HBITMAP)::CreateDIBSection(0, lpInfo, DIB_RGB_COLORS, 0, 0, 0x0);
    

    ... und mache dann den Rest wie oben (Attach(), CreateCompatibleDC(), SelectObject(), StretchBlt() etc.), sehe ich nur eine grünliche Variante meines zu blittenden Bildes (allerdings mit dem richtigen Seitenverhältnis, Ausrichtung, Zeilenlänge etc.), und es flackert heftigst.

    Was mach ich falsch?

    Mac



  • Ok, hab's hingekriegt. Hier der Code:

    if (0 == m_pBitmapInfo)
        {
            m_pBitmapInfo = (BITMAPINFO *) (new BYTE[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)]);
        }
    
        m_pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        m_pBitmapInfo->bmiHeader.biWidth = m_width;
        m_pBitmapInfo->bmiHeader.biHeight = m_height;
        m_pBitmapInfo->bmiHeader.biPlanes = 1;
        m_pBitmapInfo->bmiHeader.biBitCount = 8;
        m_pBitmapInfo->bmiHeader.biCompression = BI_RGB;
        m_pBitmapInfo->bmiHeader.biSizeImage = m_width*m_height;
        m_pBitmapInfo->bmiHeader.biClrUsed = 0;
        m_pBitmapInfo->bmiHeader.biClrImportant = 0;
    
        if (0 != datap)
        {
            if (0 != m_pBitmapInfo)
            {
                for (int n=0; n < 256; n++)
                {
                    m_pBitmapInfo->bmiColors[n].rgbBlue=n;
                    m_pBitmapInfo->bmiColors[n].rgbGreen=n;
                    m_pBitmapInfo->bmiColors[n].rgbRed=n;
                    m_pBitmapInfo->bmiColors[n].rgbReserved=0;
                }
            }
    
            HBITMAP dibBmp = (HBITMAP)::CreateDIBSection(0, m_pBitmapInfo, DIB_RGB_COLORS, 0, 0, 0x0);
    
            CDC dcMem_display;
            dcMem_display.CreateCompatibleDC(dc);
    
            CBitmap cBmp;
            cBmp.Attach(dibBmp);
            cBmp.SetBitmapBits(m_width*m_height, datap);
    
            HBITMAP BitmapOld = (HBITMAP)SelectObject(dcMem_display, dibBmp);
    
            dc->StretchBlt(xOffset, yOffset, m_width*rectSizeX, m_height*rectSizeY, &dcMem_display, 0, 0, m_width, m_height, SRCCOPY);
    
            dcMem_display.SelectObject(BitmapOld);
            dcMem_display.DeleteDC();
    
        }
    

    Mac


Log in to reply