AVI aus BMPs erstellen
-
Hallo zusammen,
ich erstelle aus einem anwendungs-spezifischen Format 8 Bit Graustufen Bitmaps. Diese können auch von allen möglichen Viewern angzeigt werden, selbst Paint Brush kann sie lesen. So weit so gut.
Nun möchte ich diese Bitmaps in ein AVI stecken. Wenn ich dafür die Bilder mit LoadImage lade:HBITMAP hbm=(HBITMAP)LoadImage(NULL,"c:\\temp.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);dann bekomme ich einen Null-Pointer zurück, also geht ja irgendwas beim Laden schief.
Probiere ich es mit Bildern die von PBrush selbst erzeugt wurden, dann funktioniert es wunderbar und ich kann das Video anschauen.Hier mal der Code, der mir die Bilder erzeugt:
unsigned long written = 0; char* bmpfad = "c:\\temp.bmp"; // Graustufenpalette definieren LPBYTE pPalette = new BYTE[1024]; for (int i=0; i<256; i++) { pPalette[4*i] = i; // R pPalette[4*i+1] = i; // G pPalette[4*i+2] = i; // B pPalette[4*i+3] = 0; // alpha } // Infoheader definieren BITMAPINFOHEADER infoheader; ZeroMemory(&infoheader, sizeof(BITMAPINFOHEADER)); infoheader.biSize = sizeof(BITMAPINFOHEADER); infoheader.biWidth = 640; infoheader.biHeight = 480; infoheader.biPlanes = 1; infoheader.biBitCount = 8; infoheader.biClrUsed = 0; infoheader.biCompression = BI_RGB; infoheader.biSizeImage = 0; infoheader.biXPelsPerMeter = 2834; //72 dpi infoheader.biYPelsPerMeter = 2834; //72 dpi infoheader.biClrImportant = 0; // Fileheader definieren BITMAPFILEHEADER fileheader; fileheader.bfType = 19778; fileheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 307200 + 256 * sizeof(pPalette); fileheader.bfReserved1 = fileheader.bfReserved2 = 0; fileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(pPalette); HANDLE hfile = CreateFile(bmpfad, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, 0); WriteFile(hfile, &fileheader, sizeof(BITMAPFILEHEADER), &written, NULL); WriteFile(hfile, &infoheader, sizeof(BITMAPINFOHEADER), &written, NULL); WriteFile(hfile, pPalette, 1024, &written, NULL); WriteFile(hfile, &cur_pic.image, sizeof(cur_pic.image), &written, NULL); // cur_pic.image ist das array mit den eigentlichen Bilddaten //printf("Bytes geschrieben:%u\n",&written); CloseHandle(hfile);Ich habe momentan keine Idee, weshalb er sich meiner selbst erezugten AVIs verweigert. Jemand von euch?
Ich bin leider noch nicht durch diese device context durchgestiegen. Wie könnte ich mir denn aus dem array cur_pic.image mittels CreateDIBSection ein HBitmap konstruieren das auch in 8 Bit Graustufen codiert ist? Geht das irgendwie?
Dann könnte ich die Daten 'on the fly' in den AVI-Generator stecken. Wäre vermutlich schneller.Besten Dank soweit!
Grüße,
Markus
-
Vllt hilft dir das
:1. http://www.adp-gmbh.ch/win/programming/avi_examples/avi_from_file.html
2. http://www.adp-gmbh.ch/win/programming/avi/avi.html
-
Danke für den Link.
Ich habe noch die Originalversion von Lucian Wischik.
Mit der tut es nicht, werde es mal mit der überarbeiteten versuchen.Allerdings habe ich mittlerweile eher den Verdacht, dass es an dem Header liegt. Wenn ich ein selbst erstelltes BMP unter PBrush erneut speichere, kann er es einlesen. Allerdings stimmt dann die Farbpalette nicht mehr.
MfG,
Markus