Bitmap mit einfacher (Konsolen)Anwendung einlesen (-> Grauwerte)
-
Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Danke erstmal für die Antworten!
@way
Ich würde gern auf dich zurück kommen und mir das, was du geschrieben hast anschauen(ich schreib dich gleich mal per PN an).
Was ich aber nicht ganz verstehe ist das mit der Bitkarte und den 2 Farbwerten...
Nachdem was ich nis jetzt gelesen hab, hab ich gedacht, dass in so ner BMP standartmäßig 3 Farben (RGB) drin stehen würden und sich daraus Grau zusammen setzt...Ich hab ja auch schon drüber nachgedacht mich vllt. selbst ran zu trauen. Wie man Files ein prinzipiell einlesen kann (fstream usw.) weiß ich schon!
Jetzt hab ich aber irgendwie nen Problem mit dem Datentyp den ich da einlesen
Wenn ich mir ne BMP mit dem Texteditor anschaue sind da nur kryptische Zeichen drin. Aber laut http://de.wikipedia.org/wiki/Windows_Bitmap sollen das ja aber anscheinend Integerwerte sein ?!(Eine Frage nebenbei, den Datenty DWORD gibts anscheinend in den Klassen(iostream, fstream, ...) die ich bis jetzt verwendet habe gar nicht. Hab gelesen, dass wäre aber ein unsigned long int, kann ich also einfach das als Datentyp hinschreiben ?)
Wenn ich die Datei einlesen möchte, was muss ich also als Datentyp verwenden, um da auch verwerdbare Zahlen stehen zu haben?
Kann man auch ganz gezielt an bestimmten Punkten der Datei einzelne Zeichen lesen?
Ich kenne bis jetzt nur getline, also das man ne ganze Zeile auf einmal liest und datei >> variable; das funktioniert dann immer so Blockweise bis zu Leerzeichen oder Tabulatoren...Vielen Danke schonmal

-
DWORD kommt von der WinAPI:
http://msdn.microsoft.com/en-us/library/cc230318.aspx
(ja, kannst eigl. unsigned long dafür nehmen, sofern du nicht vorhast das mal auf ein anderes System zu portieren, wo DWORD dann ev. einen anderen Datentypen hat, was unwahrscheinlich ist.)Für das einlesen brauchst du eine Reihe von Typen, wo du dann auch noch auf das Alignment achten musst.
Schau dir doch mal das Beispiel an, dass auf der Wikipedia Seite verlinkt ist. (ganz unten).
-
So... Hab den ganzen Nachmittag versucht durch die Bitmap.h durchzusteigen, auf die in dem Wiki-Artikel hingewiesen wird (http://www.kalytta.com/bitmap.h).
Wollte einfach mal sehen, ob ich Verstanden habe wie es geht.
Also kleines Programm geschrieben und schon auf die ersten Probleme gestoßen!#include <iostream> #include "Bitmap.h" using namespace std; int main() { CBitmap(); cout << CBitmap().Load("Test.BMP") << endl; cout << CBitmap().GetBitCount() << endl; cout << CBitmap().GetWidth() << endl; cout << CBitmap().GetHeight() << endl; return 0; }Ausgegeben werden mir 1, 0, 0, 0!
Also wird die Test-Datei ja anscheinend erfolgreich geladen. Die anderen Funktionen werten den Header der Datei aus. Aber es kann doch nicht sein, dass da nur Nullen drin stehen...
Kennt vllt. wer die Bitmap.h oder hat sonst ne Idee, was ich falsch mache?
-
Ich würde gern auf dich zurück kommen und mir das, was du geschrieben hast anschauen(ich schreib dich gleich mal per PN an).
Ich kann dir gerne meinen Bitmapdecoder schicken wenn du möchtest. Ist
schon etwas länger, deswegen schick ich ihn dir lieber per E-Mail. PN
gibts hier nicht, du solltest gleich eine E-Mail von mir erhalten.Was ich aber nicht ganz verstehe ist das mit der Bitkarte und den 2 Farbwerten...
Nun, du kannst eine Bitmap in verschiedenen Farborgamenten speichern. Das
mit der RGB-Tabelle stimmt schon, nur gibt es bei beispielsweiser
einer Monochronen Bitmapdatei nur zwei Farbpigmente.
Eine einfache Möglichkeit wäre einfach, jeden RGB-Wert
umzutransferieren, ist aber Mühseelig...Wie man Files ein prinzipiell einlesen kann (fstream usw.) weiß ich schon!
Ist halt nicht nur einlesen, musst noch zu den entsprechenden Blöcken
springen usw.Ich kenne bis jetzt nur getline, also das man ne ganze Zeile auf einmal liest und datei >> variable; das funktioniert dann immer so Blockweise bis zu Leerzeichen oder Tabulatoren...
Hehe, nee das macht man so nicht. Wie ich bereits sagte, wird so den
einzelnen Blöcken gesprungen und eingelesen. Ist aber etwas komplizierter
wenn du's genauer wissen möchtest.Wenn ich mir ne BMP mit dem Texteditor anschaue sind da nur kryptische Zeichen drin. Aber laut http://de.wikipedia.org/wiki/Windows_Bitmap sollen das ja aber anscheinend Integerwerte sein ?!
Das sind die Werte die du dir aus der Bitmap geholt hast. Diese Werte
werden als DWORD, ist glaub ich ein Win32-API-Datentyp, gespeichert. 1
DWORD entspricht gleich einem unsigned long.(Eine Frage nebenbei, den Datenty DWORD gibts anscheinend in den Klassen(iostream, fstream, ...) die ich bis jetzt verwendet habe gar nicht. Hab gelesen, dass wäre aber ein unsigned long int, kann ich also einfach das als Datentyp hinschreiben ?)
Ein drüber.
Wenn ich die Datei einlesen möchte, was muss ich also als Datentyp verwenden, um da auch verwerdbare Zahlen stehen zu haben?
Ich habs so gemacht, den BITMAPFILEHEADER und den BITMAPINFOHEADER
einzeln einlesen, so haste dann die ganzen Daten.Kann man auch ganz gezielt an bestimmten Punkten der Datei einzelne Zeichen lesen?
Klar, die Daten hast du nachdem du die Struktur (In meinem Falle ist's
ne Struktur) eingelesen hast.Ich hab dir ne E-Mail geschrieben, kannst mich auch im ICQ adden, dann
kann ich dir besser helfen wenn du was nicht verstehst. (ICQ: 311-479-366)
-
Danke erstmal an way, hab dir auch mal ne Mail geschrieben

irgendwie hab ich noch arge Verständnisprobleme. Deshalb hab ich mir jetzt mal aus dem Zeug was ich gefunden habe was ganz kleines selber zusammen gebastelt.#include <iostream> #include <fstream> #include <windows.h> using namespace std; typedef struct { WORD bfType; DWORD bfSize; DWORD bfReserved; DWORD bfOffBits; }FILEHEADER; int main() { FILE *f; f=fopen("Test.BMP","rb"); FILEHEADER FH; fread(&FH,14,1,f); cout << FH.bfType << endl; cout << FH.bfSize << endl; cout << FH.bfReserved << endl; cout << FH.bfOffBits << endl; fclose(f); return 0; }Mit dem was mir das Programm liefert kann ich aber irgendwie nicht viel anfangen. Hier mal die Zeilen, die mir das Prog bei einer ca. 300kb großen BMP ausgibt:
19778 4 70647808 3435921408Also der erste Wert sollte ja "BM" lauten. Was mich schon wundert, wenn ich das als eine Art Integer einlese. Oder muss ich das erst irgendwie umwandeln?
Und spätestens der dritte Wert ist ja ganz was anderes, als das was er sein sollte (0!?)...
Und der vierte Wert... Wenn ich das richtig sehe müssten dann ja die Bilddaten erst nach über 400MB anfangen
Vielleicht könnt ihr mir ja sagen, wo mein Denkfehler ist

-
Hatte heute leider noch nicht viel zeit weiter an dem Problem zu arbeiten, aber ich bin dran! Ich hoffe weiter auf euere Hilfe!
Mir ist aufgefallen, dass ich einem char ja auch auch einen Integer zuweisen kann. Wenn ich das mit bfType mache, bekomme ich immerhin schonmal das "B" ausgegeben. Aber irgendwie komm ich an das "M" im Header nicht ran...
Und wie ich aus dem REst was brauchbares bekomm ist mir noch ein größere Rätsel. Hilfe

-
Ich häng irgendwie total. Auch meine Recherchen im Internet haben mich nicht weiter gebracht...
Kann hier keiner helfen???
-
Hallo,
ich bin der Ersteller der auf Wikipedia verlinkten bitmap.h. Wenn es Probleme damit gibt (keine c/c++ spezifischen Fragen) könnt ihr mich gerne kontaktieren. Meine Kontaktdaten findet Ihr auf meine Homepage http://www.kalytta.com.
-
Ich hätte da auch noch eine Frage zur bitmap.h
Angenommen ich habe ein Bild mit x*y Pixel und ich benötige den Grauwert aus Pixel (x',y') wobei x',y' \in 1...x oder eben 1...y
Nun lade ich das Bild, sei es Bild.bmp mittels des Headers bitmap.h. Ist es möglich den Grauwert aus dem Bild zu lesen und in welchem Format werden mir die Werte ausgegeben?
-
Vermutlich über die Methode CBitmap::GetBits. Den Grauwert erhältst du folgende:
int l = ( 77 * r + 151 * g + 28 * b + 128 ) >> 8;