Image aus Speicherbereich erstellen ?

Hroudtwolf

Mitglied
Servus zusammen,

Ich versuche seit Stunden vergeblich ein Bitmap aus einem Speicherbereich zu erstellen (unter Win32)
Die Bitmaps liegen jeweils als Ganzes in Speicherbereichen von denen ich die Grösse so wie den Ort weiss.

Ich weiss wohl dass das Anlegen eines Bitmaps mit Hilfe der SetDIBits- und der CreateBitmap-API funktionieren muss.
Jedoch verstehe ich noch nicht so ganz wie ich es anwenden muss.


Ich bin für jede Hilfe dankbar.

MfG :)

Wolf


PS: Ich kann hier aus Projekttechnischen Gründen keine fertigen Laufzeitbibliotheken nutzen.
 
Wie genau liegen die Bitmaps denn vor? Als Farbwertpuffer oder als tatsächliches .bmp-File im Speicher?

Hier mal ein Schnipsel aus meiner Code-Sammlung, muss vermutlich angepasst werden:

pData ist ein void-Pointer, der erhält dann die Adresse des Speicher-Bereiches. Wenn das HBITMAP erstellt ist, kannst du einfach deine Pixeldaten reinschieben und mit dem HBITMAP arbeiten (BitBlt etc.)

Code:
  BITMAPINFO      bminfo;

    bminfo.bmiHeader.biSize         = sizeof( BITMAPINFOHEADER );
    bminfo.bmiHeader.biPlanes       = 1;
    bminfo.bmiHeader.biBitCount     = ucBpp;
    if ( ucBpp == 15 )
    {
      // ich unterscheide bei 16bit die beiden Modi X1R5G5B5 und R5G6B5, Windows benutzt IMMER X1R5G5B5 (auch wenn die Karte das nicht macht)
      bminfo.bmiHeader.biBitCount   = 16;
    }
    bminfo.bmiHeader.biCompression  = BI_RGB;
    bminfo.bmiHeader.biSizeImage    = 0;
    bminfo.bmiHeader.biClrUsed      = 0;
    bminfo.bmiHeader.biClrImportant = 0;
    bminfo.bmiHeader.biWidth        = ulNewWidth;
    bminfo.bmiHeader.biHeight       = - (signed long)ulNewHeight;   // minus, damit es TOP-DOWN ist

    HDC hDC = CreateCompatibleDC( NULL );
    HBITMAP hbm = CreateDIBSection( hDC, &bminfo, DIB_PAL_COLORS, &pData, NULL, 0 ) );
    HBITMAP m_hOldBitmap = (HBITMAP)SelectObject( hDC, hbm );
    // Paletten-Objekt anlegen
    if ( ucBpp == 1 )
    {
      stPal.wNumberOfEntries  = 2;
      for ( i = 0; i < 2; i++ )
      {
        stPal.aEntry[i].peRed   = 0;
        stPal.aEntry[i].peGreen = 0;
        stPal.aEntry[i].peBlue  = 0;
        stPal.aEntry[i].peFlags = PC_NOCOLLAPSE;
      }
      SetPaletteObject( CreatePalette( (LOGPALETTE far *)&stPal ) );
    }
    else if ( ucBpp == 4 )
    {
      stPal.wNumberOfEntries  = 16;
      for ( i = 0; i < 16; i++ )
      {
        stPal.aEntry[i].peRed   = 0;
        stPal.aEntry[i].peGreen = 0;
        stPal.aEntry[i].peBlue  = 0;
        stPal.aEntry[i].peFlags = PC_NOCOLLAPSE;
      }
      SetPaletteObject( CreatePalette( (LOGPALETTE far *)&stPal ) );
    }
    else if ( ucBpp == 8 )
    {
      for ( i = 0; i < 10; i++ )
      {
        stPal.aEntry[i].peFlags = 0;
      }
      for ( i = 10; i < 246; i++ )
      {
        stPal.aEntry[i].peRed   = 0;
        stPal.aEntry[i].peGreen = 0;
        stPal.aEntry[i].peBlue  = 0;
        stPal.aEntry[i].peFlags = PC_NOCOLLAPSE;
      }
      for ( i = 246; i < 256; i++ )
      {
        stPal.aEntry[i].peFlags = 0;
      }
      SetPaletteObject( CreatePalette( (LOGPALETTE far *)&stPal ) );
    }
    // da ist möglicherweise Müll im Speicher, also noch löschen!
 
Vielen Dank für den Schnipsel.
Ich werd auch gleich schauen ob das damit funktionieren kann.

Wie genau liegen die Bitmaps denn vor? Als Farbwertpuffer oder als tatsächliches .bmp-File im Speicher?

Die Bitmaps sind File-Dumps. Also komplette BMP-Files wie sonst auf Disk.
 
Zurück