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).