BMP-Files



  • Hallo, bitte nicht erschrecken sollte meine Frage reiner Blödsinn sein.

    Ich schreibe zur Zeit an einer Diplomarbeit im Bereich der Bildverarbeitung. Hierzu benötige ich die 'rohen' Bilddaten. Ist es möglich mit C ein BMP- File einzulesen und es dann in eine Binärdatei umzuwandeln?

    Schonmal vielen Dank im voraus...

    Markus



  • Eine BMP-Datei ist bereits im Binär-Format.
    Einlesen kannst Du die natürlich. Kannst z.B. einfach die Datei binär öffnen und entsprechend die Header (BITMAPINFOHEADER, BITMAPFILEHEADER) und Bildinformation auslesen.



  • Ok danke soweit. Jetzt wäre noch gut, wie du mir sagst wie ich ein bmp- File, das meinetwegen Foto.bmp heißt in C binär öffne. kurz der code wäre ned schlecht 🙂

    sorry meine Zeit reine C- Zeit liegt schon etwas weiter im Studium zurück, blöd, dass ich es jetzt ausgerechnet nochmal brauche....



  • FILE *f = fopen(dateiname, "rb");
    fclose(f);

    fread(), fseek(), fwrite() brauchst du auch noch. wenn du lesen und schreiben willst, brauchst du rb+



  • wenn du es dir einfach machen willst, musst du sicherstellen, dass alle inputfiles 24bit farbtiefe haben. dann kannste sehr simpel die bilddaten auslesen, 3 bytes pro pixel, direkt nach dem header. wenn du das dann als RAW binary haben willst, kannste die alle wieder ausgeben, als RGB oder BGR. oder du gibst lieber gleich wieder in ein BMP-file aus.



  • ich wuerd mir ein tool schreiben, was die bmps (egal welche farbtiefe) in raw 32 bit daten umwandelt (24 bit benutzt). das macht sich fuer schnelles laden und speichern gut, wenn man die ausgangsdaten vorher aufbereitet.



  • noch ein kleines problem: das öffnen funktioniert soweit, jetzt habe ich nur noch schwierigkeiten mit dem einlesen der daten, d.h. mit dem befehl fread. welchen datentyp muss das feld haben, in dem ich die bilddaten einlesen will???

    villeicht kann ja jemand mit dem ganzen code schnell helfen...

    danke



  • wie schon erwähnt, solltest du dich erstmal auf reine 24bit-BMPs beschränken, wenn du jetzt schon derartige probleme hast.

    du musst einfach nur ein dokument nehmen, wo das BMP-dateiformat beschrieben wird. dann kannst du im index die wichtigen infos holen (länge und breite in pixeln), und nach dem header einfach die bilddaten in ein outfile dumpen, wenn es das denn sein soll. eventuell musste die noch von BGR nach RGB sortieren, je nach anforderung.

    wenn dir das lesen mit fread und buffern zu schwierig ist, dann mach das ganze lieber mit fgetc und fputc, byteweise. damit bist du dann aber etwas limitiert, und wenn du später programmatisch veränderungen am bild machen willst wäre die lösung mit dem buffer deutlich besser. so ein buffer wäre natürlicherweise ein unsigned char buffer mit der größe von (pixelbreite * pixellänge * bytes pro pixel). oder du machst dir einen array aus structs mit jeweils R, G, und B als unsigned char.

    /EDIT: für reine programmatische änderungen an statischen, also nicht-bewegten bildern eignet sich die SDL sehr gut, da man damit innerhalb von wenigen minuten ein simples framework bauen kann.
    habe mir da eins gebaut für "grafikfilter", also einfach BMP einlesen, pixel für pixel bearbeiten und als BMP wieder ausgeben. das framework hat grad mal 12 zeilen code, plus SDL pixel functions.



  • fread will als puffer einen char*.

    bitte nimm dir die zeit, dir ein c tutorial durchzulesen. als auffrischung.

    und hier hast du noch eine referenz zum nachschlagen:
    http://www-ccs.ucsd.edu/c/



  • ich habe mal einen BMP Loader und Saver programmier, der auf Linux und Windows Funktioniert - aber nur für 24 Bit (unkomprimiert) der Quellcode ist hier:

    guckst du unter Alphablender (der Code ist etwas Quick & Dirty - aber funktioniert)
    http://turing.fh-landshut.de/~jamann/code.html

    Informationen zum BMP Format:
    http://turing.fh-landshut.de/~jamann/Das BMP Format.html

    wenn du Probleme mit dem BMP Loader hast schick mir einfach eine E Mail (z. B. wenn du 256 Farben Bitmaps laden willst)


Anmelden zum Antworten