BMP-Datei öffnen und weiterverarbeiten...
-
Hallo,
ich will eine bmp-Datei in meinem C-Programm einlesen und weiterverarbeiten...
Jetzt bin ich auf der Suche nach einem Beispielcode und/oder libs, die das bewerkstelligen können...
Bisher öffne ich die Bilder in matlab und über dessen Api hol ich mir die Grauwerte in das C-Programm. Dies möchte ich natürlich gerne umgehen, da ich etwas unabhängiges und nicht propritäres benötige...
Danke schonmal---
mfg
NablA
-
Wenn du die Bilddaten selber interpretieren willst, solltest du dich mal mit dem Aufbau des BMP-Formats auseinandersetzen.
-
Ja, okay. Aber ich dachte es gibt eventuell bereits eine Beispielimplmentierung für dieses ja wohl relativ alltägliche Problem?
Das Format ist mir grundsätzlich klar.
Danke
-
Ja, du könntest auch die WinAPI oder MFC verwenden - LoadImage() lädt das Bild, danach kannst du z.B. über GetPixel() an die einzelnen Bildpunkte herankommen.
(wie genau das geht, habe ich auch noch nicht ausprobiert, aber du kannst ja etwas in der MSDN dazu stöbern)
-
-
Moin,
also erstmal vielen Dank für eure Hilfe, hab mir aber jetzt doch was selbst gebaut. Nun aber zu meinem Problem:
Ich habe folgende Funktion geschrieben:
void load_bitmap_file(char *filename, image* bmppic) { FILE *filePtr; //our file pointer BMPFILEHEAD bitmapFileHeader; //the bitmap file header BMPINFOHEAD bitmapInfoHeader; //the bitmap info header unsigned char *bitmapImage; //store image data int imageIdx=0; //image index counter unsigned char tempRGB; //our swap variable bmppic->no_of_cols = 0; bmppic->no_of_rows = 0; //open filename in read binary mode filePtr = fopen(filename,"rb"); if (filePtr == NULL) { } //read the bitmap file header fread(&bitmapFileHeader.bfType, 14,1,filePtr); //verify that this is a bmp file by check bitmap id if (bitmapFileHeader.bfType !=0x4D42) { fclose(filePtr); } //read the bitmap info header fread(&bitmapInfoHeader, sizeof(BMPINFOHEAD),1,filePtr); // calculate offset to picturedata int pointer_mover = 14+40; // Size of FILEHEADER and INFORMATIONHEADER if (bitmapInfoHeader.biCompression == 3) { pointer_mover = pointer_mover + 3*4; // 3 DWORDS FOR BITMASKS } if (bitmapInfoHeader.biClrUsed == 0) { if ( (bitmapInfoHeader.biBitCount == 1) || (bitmapInfoHeader.biBitCount == 4) || (bitmapInfoHeader.biBitCount == 8) ) { pointer_mover = pointer_mover + 4*pow(2,bitmapInfoHeader.biBitCount); // 2^bitmapInfoHeader.biBitCount entries in colourmap (each colormap = 4 Bytes) } } else { pointer_mover = pointer_mover + 4*bitmapInfoHeader.biClrUsed; // bitmapInfoHeader.biClrUsed entries in colourmap (each colormap = 4 Bytes) } //move file pointer to the begging of bitmap data fseek(filePtr, pointer_mover, SEEK_SET); //allocate enough memory for the bitmap image data bitmapImage = (unsigned char*)malloc(bitmapInfoHeader.biSizeImage*sizeof(unsigned char)); bitmapImage[0] = '1'; //read in the bitmap image data fread(bitmapImage,bitmapInfoHeader.biSizeImage,1,filePtr); //make sure bitmap image data was read if (bitmapImage == NULL) { fclose(filePtr); } //close file and return bitmap iamge data fclose(filePtr); // Write Image Struct bmppic->no_of_cols = bitmapInfoHeader.biWidth; bmppic->no_of_rows = bitmapInfoHeader.biHeight; bmppic->image_data = (int*) malloc (bitmapInfoHeader.biSizeImage*sizeof(int)); // Sort picturedata to image struct int i=0, k=0, j=0; if (bitmapInfoHeader.biHeight >= 0) // BOTTOM-UP-STRUCTURE IN BITMAP-FILE { for (k=0; k<=bmppic->no_of_cols; k++) { for (j=1; j<=bmppic->no_of_rows; j++) { bmppic->image_data[i] = bitmapImage[((bmppic->no_of_rows-j)*bmppic->no_of_cols)+k]; i++; } } } else // UP-DOWN-STRUCTURE IN BITMAP-FILE { for (k=0; k<=bmppic->no_of_cols; k++) { for (j=0; j<=bmppic->no_of_rows; j++) { bmppic->image_data[i] = bitmapImage[((j*bmppic->no_of_cols)+k)]; i++; } } } free(bitmapImage); }
Diese Funktion soll mir ein BMP-File einlesen und es in eine von mir definierte Struktur schreiben, dafür übergebe ich Ihr den Dateinamen und einen Zeiger auf meine Struktur. Das Problem besteht nun darin, dass die Funktion beim ersten mal durchlaufen wird und einwandfrei funktioniert. Beim zweiten Mal erhalte ich bei der Definition des unsigned char Arrays folgende Fehlermeldung:
Nicht abgefangene Ausnahme in xyz.exe (NTDLL.DLL): 0xC0000005: Access Violation.
Dieser Fehler wiederholt sich dann beim allozieren des Speichers und beim Versuch in eine Stelle des Char-Arrays zu schreiben bricht das Programm vollständig ab. (NUR beim 2. Durchlauf der Funktion)... Hat da jemand eine Idee woran es liegen könnte???
mfg
NablA