WinAPI unter C: Bitmap
-
Hallo zusammen,
ich hänge nun fast drei Tage vor einem Problem und mir gehen bald die Haare aus deswegen. Ich habe RGB Werte aus einem PPM ausgelesen und einen Pointer (*bild) auf diese Werte. Da die Farbinformationen (3 Byte /Pixel) in Reihenfolge RGB liegen, habe ich eine Funktion geschrieben, die mit das ganze in die Reihenfolge GRB für Bitmaps bringt.
Die BITMAPINFO habe ich ebenfalls erstellt:
BITMAPINFO bi; BITMAPINFOHEADER bmih; ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER)); bmih.biSize=sizeof(BITMAPINFOHEADER); bmih.biHeight=(long)pic_height; bmih.biWidth=(long)pic_width; bmih.biPlanes=1; bmih.biBitCount=24*sizeof(byte); bmih.biCompression=BI_RGB; bmih.biSizeImage = bmih.biWidth * bmih.biHeight * 3 * bmih.biBitCount; bmih.biXPelsPerMeter = 0; bmih.biYPelsPerMeter = 0; bmih.biClrImportant = 0; bi.bmiHeader = bmih;Schreibe ich das ganze nun in eine Datei mit
FILE *bmpFile = fopen("test.bmp", "w+"); // open file if(bmpFile){ // write Bitmapfile fwrite(&bmfh, sizeof(BITMAPFILEHEADER), 1, bmpFile); fwrite(&bmih, sizeof(BITMAPINFO), 1, bmpFile); fwrite(bild, pic_width*pic_height*3, 1, bmpFile); } fclose(bmpFile); // close fileerhalte ich ein bmp, das Windows problemlos liest.
BITMAPFILEHEADER:
BITMAPFILEHEADER bmfh; bmfh.bfType = 19778; // must be BM (or 19778 ASCII) bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + pic_width*pic_height*3; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);Will ich die Datei nun mittels
hBitmap=(HBITMAP)LoadImage(NULL,"pfad/test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
laden, bekomme ich einen Fehler angezeigt. GetLastError ergibt: 4207216Hat vielleicht jemand eine Idee, was ich falsch mache?
Des Weiteren würde ich gerne die Folge der GRB-Werte in einen BRUSH einlesen, jedoch weigert sich CreatePatternBrush dagegen.
Ich habe nun wirklich drei geschlagene Tage darüber gebrütet und hoffe, daß mir jemand von euch weiterhelfen kann.
Besten Dank schonmal,
Tscherno
-
Nach einer weiteren Woche des Grübelns und Haareraufens habe ich es nun geschafft, daß das eingelesene Bild nun im gewünschten Fenster angezeigt wird. Das ganze habe ich gelöst, indem ich ein
RGBTRIPLE Bild[width * height]
erstellt habe und dieses Array mit den RGB Werten gefüttert habe. Anschließend wird der BITMAPINFOHEADER dem Bild entsprechend generiert und mit CreateDIBitmap ein HBITMAP erstellt, um dieses dann mit StretchDIBits an das Fenster zu schicken.
Das nur zur Information

Nun stehe ich bei großen Bilder vor dem Problem, daß das Array zu groß wird. Ein 512x512 Bild wird problemlos dargestellt, ein 1024x1024 Bild bringt das Programm jedoch zum Absturz.
Hat jemand einen Tip, wie ich das Problem lösen kann?
Grüße,
Tscherno