Arbeiten mit BMP Dateien in C

Brotkopf10

Newbie
Registriert
Dez. 2012
Beiträge
5
hallo zusammen,
ich brauche keine komplettlösung, sondern nur einen Gedankenanstoß.
Ich würde gerne mit BMP Dateien in C arbeiten. Das bedeutet sie zu lesen zu verändern und neu zu schreiben.
Mir ist klar, dass es dafür bestimmte Funktionen gibt und ich mir welche selber basteln muss.
Habe schon sämtliche Foren und E-Books durchsucht. In den Büchern find ich nichts passendes und viele Foren setzen zu viel Vorwissen vorraus.
Bitte gibt mir doch einen kleinen knackigen Anstoß!

MfG
 
Ich hab das ganze mal in PHP gemacht.

Erstell dir am besten 2 Bilder die so 10x10 Pixel groß sind.
Das eine machst du komplett weiß, das andere komplett schwarz.

Dann lässt du dir das Bild als Binärstream (Text) ausgeben und siehst somit, wie viel Bit der Header lang ist. (Deswegen schwarz und weiß, weil nach dem Header dann alles 1-en oder 0-en sind und ich nicht mehr weis, mit welchen Bits der Header aufgebaut ist.

Ein Pixel besteht dann immer aus 3 Byte, die du frei bearbeiten kannst.
Ich hoffe das ist erstmal Denkanstoß genug.

Wenn ich heute zu Haus bin kann ich ja nochmal mein Projekt dazu ausgraben.
Ziel war es, einen eingegebenen Text in einen Binärstream umzuwandeln und vom jedem Farbbyte das letzte Bit mit einem Bit aus dem Textbinärstream zu ändern.
Somit hat man quasi Text in einem Bild, ohne das sich das Bild für das menschliche Auge verändert, da das letzte Bit des Farbbytes natürlich am wenigsten Einfluss auf die Farbe hat.


MfG
Paul
 
Hi,

mach dich vertraut mit dem Dateiformat, also wie ist eine Grafik in bmp aufgebaut. Wie sieht der Header aus, wie werden die Farben abgespeichert etc. Dann überlegst du dir, wie du die Daten Blockweise auslesen kannst aus einer Datei. Dann käme die Darstellung des Bildes und dann sollten auch Änderungen keine Hürde darstellen. Zuletzt sollten die Daten wieder Blockweise geschrieben werden und fertig ist der Datensalat ;)
Wie du die einzelnen Punkte umsetzt verrät dir google, aber das wird eine Menge Recherche!

VG
BassT
 
Danke schonmal für die kurzfristigen Antworten!
Mir ist bewusst, dass ich an die Informationen im Header kommen muss. Nur leider kenne ich keinen Algorithmus oder Funktion, die mir diese liefert.
Ich werde mich nochmal intesiv mit dem Dateiformat .bmp auseinandersetzen.
 
Brotkopf10 schrieb:
Danke schonmal für die kurzfristigen Antworten!
Mir ist bewusst, dass ich an die Informationen im Header kommen muss. Nur leider kenne ich keinen Algorithmus oder Funktion, die mir diese liefert.
Ich werde mich nochmal intesiv mit dem Dateiformat .bmp auseinandersetzen.

Du brauchst auch keinen Algorithmus oder so, da jede Information eine festgeschriebene Länge hat. Du kannst die Datei einlesen und dann durch die Datei hüpfen wie du magst, da man ja aus den Längen errechnen kann, wo welche Information steht.

Ansonsten würde ja auch eventuell jedes Programm die Datei anders behandeln, wenn es keinen festgelegten Standard gibt. ; )
 
Was genau willst du an den Dateien verändern? Willst du sie wirklich pixelbasiert manipulieren oder einfach global Krams machen wie: Kontrast, Auflösung, einen Ausschnitt herauslösen, etwas anderes darüber legen,... in dem Falle könntest du einfach ImageMagick einsetzen (bzw. dessen C-Bindings).
 
Danke nochmals für die Antworten!

Ich würde gerne Pixelweise die Bilder bearbeiten.
Also entweder habe ich echt ein großes Verständnisproblem oder mir fehlt sämtliches Vorwissen.
Der quellcode von "asdfman" konnte mir ein wenig weiterhelfen um zu verstehen, wie man mit den erlesenen Daten umgeht.

Um noch ein besseres Verständnis zu erlangen, würde ich gerne mal ein bild einlesen. Ein bestimmtes Pixel herausnehmen und dessen wert auf den Bildschirm ausgeben lassen.
 
Also was ausgeben: Z.B. in der Konsole solltest du es hinkriegen.

bmp einlesen:
Code:
FILE f=fopen("asd","rb");
BITMAPINFOHEADER bmih;
fread(f,&bmih,sizeof(bmih));
char*pixel=malloc(bmih.width*bmih.height*bmih.depth/8);//Da brauchst du ein Algo um die verschiedenen "Tiefen" richtig umzurechnen
fread(f,pixel,bmih.width*bmih.height*bmih.depth/8);
fclose(f);
//fertig, nun liegen alle Pixeldaten in pixel (zugriff über pixel[x+y*width+k] k=0,1,2 für RGB
 
Nein, so geht es nicht. Die Pixel liegen dann in der falschen Reihenfolge im Speicher.
Außerdem haben Bitmaps unter Umständen eine Palette, die man beachten sollte.
 
Zurück
Oben