Bitmap zur Laufzeit ohne Datei erstellen



  • hi,

    ich möchte ne bitmap erstellen, z.b. aus einem array heraus, sodass ich die dann gleich anzeigen kann.
    (ich hab also kein problem die aus einer datei zu laden oder irgendwie darzustellen 😉 )
    ich hab schon mal (im PSDK) geguckt und CreateBitmapIndirect() gefunden. nur komm ich mit der Bitamp-Struktur nicht klar.

    typedef struct tagBITMAP {
      LONG   bmType; //muss 0 sein, kein problem
      LONG   bmWidth; //klar
      LONG   bmHeight; //auch klar
      LONG   bmWidthBytes; //jetzt hörts auf, was muss ich durch 2 teilen ?
      WORD   bmPlanes; //was um himmels willen sind planes ?
      WORD   bmBitsPixel; //naja, check ich nicht wirklich
      LPVOID bmBits; //die daten oder was ?
    }
    

    um mal ein beispiel zu sehen, hab ich mal ne bitmap geladen und mir dann die daten in einem log schreiben lassen. ergebnis:

    bitmap.bmType = 0
    bitmap.bmWidth = 300
    bitmap.bmHeight = 470
    bitmap.bmWidthBytes = 300
    bitmap.bmPlanes = 1
    bitmap.bmBitsPixel = 8
    bitmap.bmBits = 04FC0000
    

    danach bin ich aber auch nicht klüger gworden. bitmap.bmBits kann mit 8 zeichen unmöglich eine 300x470 pixel-bitmap sein. und überhaupt: kann mir jemand mal die einzelnen members erklären? und verwende ich überhaupt die richtige funktion ?

    wär echt net,
    lw



  • Du kannst auch CreateCompatibleBitmap() benutzen, die erzeugte Bitmap dann in nen DeviceContext selektieren und dann mit den Standard-GDI-Funktionen drin herum malen 😉

    typedef struct tagBITMAP {
      LONG   bmType;  // muss 0 sein
      LONG   bmWidth;  // Breite in Pixeln
      LONG   bmHeight;  // Höhe in Pixeln
      LONG   bmWidthBytes; // Die Größe in Bytes einer ScanLine
    // Wenn Du z.B. ne 321 Pixel breite Bitmap willst bei 24 Bit Farben:
    // 321 Pixel * 3 Byte (24bit) = 963 Bytes
    // ----
    // Specifies the number of bytes in each scan line. This value must be divisible 
    // by 2, because the system assumes that the bit values of a bitmap form an 
    // array that is word aligned.
    // ----
    // Der Datentyp "word" ist 2 Byte groß, also muss bmWidthBytes durch 2 teilbar sein.
    // 963 / 2 = 481,5 - ist also nicht glatt durch 2 teilbar
    // 964 / 2 = 482 - ist durch 2 teilbar. Also machen wir ne Scanline einfach
    // 964 Byte groß und haben dann eben einen Byte pro Zeile verschwendet ;D
      WORD   bmPlanes;  // muss 1 sein
      WORD   bmBitsPixel;  // Farbtiefe - setzt man normalerweise auf 24 Bit
    // 24 Bit sind 3 Bytes: 1 Byte für rot, 1 Byte für grün, 1 Byte für blau
      LPVOID bmBits; // Pointer zu den Pixeldaten (bei 24bit dann jeweils 3 Bytes pro Pixel)
    // Die Pixel müssen allerdings die Scanline-Größe berücksichtigen!
    // Nicht einfach die Pixel hintereinanderweg dareinpacken, sondern immer nen vollen Scanline!
    } BITMAP, *PBITMAP;
    


  • ich checks trotzdem noch nich ganz. 😕
    ich brauch mal ein beispiel für bmBitsPixel. bitte! *liebguck*

    lw



  • Was verstehst du jetzt daran nicht - noch nie was von Farbtiefe gehört 😕



  • ich bin nicht blöd. 🙄 (hoff ich doch mal)

    wenn das so einfach ist, dann macht es dir sicher keine mühe mal eben ein beispiel ausm ärmel zu schütteln.
    wie wärs mit ner bitmap 8 mal 8 pixel, 24bit farbtiefe und mitn paar bunten pixeln drin. möglichst in einem format, in dem ich die RGB-farben dirket angeben kann (COLORREF). 😋 😃

    lw



  • Wie hast du die Bilddaten denn vorliegen? Und was willst du anschließend haben?



  • Lawilog schrieb:

    ich bin nicht blöd. 🙄 (hoff ich doch mal)
    wenn das so einfach ist, dann macht es dir sicher keine mühe mal eben ein beispiel ausm ärmel zu schütteln.

    Mir scheint, dass mein Kommentar bei dir etwas falsch angekommen ist 🙄
    Du hattest ja geschrieben

    Lawilog schrieb:

    ich checks trotzdem noch nich ganz. 😕
    ich brauch mal ein beispiel für bmBitsPixel.

    Daraus hatte ich geschlossen, dass du dir nur über die Bedeutung von bmBitsPixel noch nicht ganz im Klaren seist 😕



  • ahh, ich dumm!
    ich meinte für bmBits
    mein fehler.

    ich habs jetzt mal mit nem BYTE-Array versucht:
    BYTE d[8*8*3] ={0xFF,0xFF,0xFF, 0xFF,0xFF,0x00, 0xFF,0x00,0xFF, ...

    8mal8 pixel, 24 bit farbteife wie gesagt.
    das seltsame ist: wenn ich bmWidthBytes auf 24 setze (8pixel3byte), dann macht er gar nichts, gib aber auch keinen fehler zurück beim aufruf von GetLastError();
    wenn ich bmWidthBytes auf 12 setze ((8pixel
    3byte)/2), dann meint GetLastError() ERROR_INVALID_PARAMETER.

    deshalb hatte ich mal um ein beispiel gebeten.

    lw

    EDIT: ich will danach eine bitmap-struktur haben, von der ich mittels CreateBitmapIndirect() ein handle bekommen kann, sodass ich das dann auf meinen screen-dc selecten kann.



  • Wäre da nicht CreateDIBSection besser?! (siehe dazu auch FAQ: Bild speichern)



  • While the CreateBitmapIndirect function can be used to create color bitmaps, for performance reasons applications should use CreateBitmapIndirect to create monochrome bitmaps and CreateCompatibleBitmap to create color bitmaps

    Nimm lieber ne andere Funktion!
    z.B. CreateDIBSection()
    Wenn Du die Farbtiefe auf 32 Bit setzt, kannste zumindest bei CreateDIBSection direkt COLORREFs benutzen, da dann nur 24 Bit benutzt werden und 8 Bit einfach leer bleiben - musst nur beachten dass die Farben nicht in RGB sondern in BGR gespeichert sind und dass ne Bitmap von unten rechts beginnt, wenn man nicht einfach ne negative Höhe angibt 😉



  • F====  F====     F====  F====  I   I  ==T==   I
    I      I         I      I      I   I    I     I
    E====  L===T     I ==T  E====  I===I    I     I
    I          I     I   I  I      I   I    I      
    L====  ====J     L===J  L====  I   I    I     o
    

    DANKE ! DANKE ! DANKE ! 🙂

    hab dann noch SetBitmapBits() genommen. ich hätte auch vorher CreateCompatibleBitmap() anstelle von CreateDIBSection() nehmen können, aber dann könnte ich COLORREF nicht direkt benutzen.

    👍 flenders, geeky ihr seid echte helden! 👍

    vielleicht interessierts ja nochjemanden:

    HDC hDC = GetDC(hWnd);
    HDC hDC_Mem = CreateCompatibleDC(hDC);
    
    BITMAPINFOHEADER bmpInfoHeader;
    bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfoHeader.biWidth = 8;
    bmpInfoHeader.biHeight = -8;
    bmpInfoHeader.biPlanes = 1;
    bmpInfoHeader.biBitCount = 32;
    bmpInfoHeader.biCompression = BI_RGB;
    bmpInfoHeader.biSizeImage = NULL;
    bmpInfoHeader.biXPelsPerMeter = 0;
    bmpInfoHeader.biYPelsPerMeter = 0;
    bmpInfoHeader.biClrUsed = 0;
    bmpInfoHeader.biClrImportant = 0;
    
    BITMAPINFO bmpInfo;
    ZeroMemory(&bmpInfo, sizeof(BITMAPINFO));
    bmpInfo.bmiHeader = bmpInfoHeader;
    void* dibvalues;
    HBITMAP hBitmap = CreateDIBSection(hDC_Mem, &bmpInfo, DIB_RGB_COLORS, &dibvalues, NULL, NULL);
    DWORD data[8*8] = {RGB(32,32,32), RGB(64,64,64), RGB(96,96,96), RGB(128,128,128), RGB(160,160,160), RGB(192,192,192), RGB(224,224,224), RGB(255,255,255),
    	RGB(32,32,32), RGB(64,64,64), RGB(96,96,96), RGB(128,128,128), RGB(160,160,160), RGB(192,192,192), RGB(224,224,224), RGB(255,255,255),
    	RGB(32,32,32), RGB(64,64,64), RGB(96,96,96), RGB(128,128,128), RGB(160,160,160), RGB(192,192,192), RGB(224,224,224), RGB(255,255,255),
    	RGB(32,32,32), RGB(64,64,64), RGB(96,96,96), RGB(128,128,128), RGB(160,160,160), RGB(192,192,192), RGB(224,224,224), RGB(255,255,255),
    	RGB(32,32,32), RGB(64,64,64), RGB(96,96,96), RGB(128,128,128), RGB(160,160,160), RGB(192,192,192), RGB(224,224,224), RGB(255,255,255),
    	RGB(32,32,32), RGB(64,64,64), RGB(96,96,96), RGB(128,128,128), RGB(160,160,160), RGB(192,192,192), RGB(224,224,224), RGB(255,255,255),
    	RGB(32,32,32), RGB(64,64,64), RGB(96,96,96), RGB(128,128,128), RGB(160,160,160), RGB(192,192,192), RGB(224,224,224), RGB(255,255,255),
    	RGB(32,32,32), RGB(64,64,64), RGB(96,96,96), RGB(128,128,128), RGB(160,160,160), RGB(192,192,192), RGB(224,224,224), RGB(255,255,255)};
    SetBitmapBits(hBitmap, 8*8*4, data);
    
    SelectObject(hDC_Mem, hBitmap);
    BitBlt(hDC, 0, 0, 8, 8, hDC_Mem, 0, 0, SRCCOPY);
    DeleteDC(hDC_Mem);
    ReleaseDC(hWnd, hDC);
    

    (sorgt für einen kleinen grau-verlauf 😉 )

    lw



  • hmm...

    das hätte ich auch gebrauchen können - damals als ich noch windows programmiert habe..
    heute mach ich ja nur noch an irgendwelchen Datenbanken und Mikrocontrollern rum...

    aber gut zu wissen, wenn ich mal wieder sowas anfangen will..



  • hallo! ich glaub du kennt dich besser mit bitmaps aus als ich, wollt dich fragen ob du mir helfen kannst??? siehe den thread screenshot:
    http://www.c-plusplus.net/forum/viewtopic.php?t=64339&sid=04325ae7068698eaf3c794cd3a9207e0

    thx 👍



  • @markoo: Nerve doch bitte nicht so rum ⚠
    ➡ Damit erreichst du dann nämlich unter Umständen genau das Gegenteil vom dem, was du willst - dass keiner mehr Lust hat dir zu helfen


Anmelden zum Antworten