Daten in ein Bitmap umwandeln



  • Hallo zusammen,

    ich habe folgende Funktion, mit der Bilder, die von einer Kamera geliefert werden, als Bitmap in einer Datei gespeichert werden können. Die Funktion GetCurrentBuffer liefert hierbei die Bilderdaten.

    pBuf = new char[size];
    BITMAPINFOHEADER bih;
    m_pGrab->GetCurrentBuffer(&size,(long*)pBuf);
    // here: pBuf buffer data is: BITMAPINFOHEADER + Pixel Data
    memcpy(&bih,pBuf,sizeof(BITMAPINFOHEADER));
    //Save To BMP File
    FILE *pf;
    pf = fopen(“C:\\Motic.bmp”,"w" );
    BITMAPFILEHEADER fi;
    fi.bfType = 0x4d42;// 'BM';
    fi.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bih.biWidth * bih.biHeight
    * (bih.biBitCount/8);
    fi.bfReserved1 = 0;
    fi.bfReserved2 = 0;
    fi.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    fwrite(&fi, sizeof(BITMAPFILEHEADER), 1, pf);
    fwrite(&bih, sizeof(BITMAPINFOHEADER), 1, pf);
    fwrite(pBuf+ sizeof(BITMAPINFOHEADER) , bih.biWidth * bih.biHeight * (bih.biBitCount/8), 1, pf);
    fclose(pf);
    delete [] pBuf;
    

    Ich möchte nun, statt die Bilder in einer Datei zu speichern, diese auf einem TImage darstellen. Wie kann ich die Daten in ein Bitmap umwandeln, das ich dann darstelle, so ähnlich wie (funktioniert leider nicht)

    TBitmap *myBitmap = new TBitmap;
    myBitmap = (TBitmap) pBuf;
    

    Vielen Dank im Voraus
    Gruss Lodo2609



  • Hallo

    Das dein zweiter Codeversuch nicht funktioniert ist klar. Zum einen ist myBitmap ein Pointer, so das der Cast auch mit Pointer laufen muß. Desweiteren kann auf keinen Fall der Typ new char* in TBitmap* gecastet werden (und wenn dann solltest du auch keine alten C-Cast benutzten sondern die C++ Casts).

    Die Lösung ist TMemoryStream. Anstatt alles in die FILE-Variable zu schreiben schreibst du es genauso in den Stream, und benutzt dann TBitmap::LoadFromStream.
    Siehe BCB-Hilfe zu TMemoryStream.

    bis bald
    akari



  • Direkt kannst du dies nicht machen, da ein TBitmap nur ein Wrapper für ein Windows::BITMAP Objekt ist.

    Das einfachste ist wohl über die Eigenschaft TBitmap::ScanLine zu gehen.
    Zuerst mußt du die richtigen Werte für die Eigenschaften Width, Height, PixelFormat etc. aus dem Header setzen.
    Anschließend kopierst du Zeile für Zeile die Pixeldaten (memcpy).
    (Sofern keine Palette benutzt wird, sondern z.B. pf24bit (RGB), funktioniert das einfach und schnell).


Anmelden zum Antworten